IPython: как сохранить значения timeit для каждой итерации

Я новичок в Python и пытаюсь построить вычислительные скорости двух функций. Например, имея две функции (см. ниже), как я могу вернуть время для каждой итерации, используя функцию timeit в IPython/Jupyter?

def func1(x) : 
    return x*x
def func2(x) :
    return x+x
%timeit for x in range(100) : func1(x)
%timeit for x in range(100) : func2(x)

Я прочитал https://ipython.org/ipython-doc/3/interactive/magics.html, что я могу использовать '-o' для "возврата TimeitResult, который может быть сохранен в переменной для более подробной проверки результата".

Но как мне сохранить его в переменной, скажем, «func1_time», и как я могу прочитать время для каждой итерации? Моя цель - построить график x в зависимости от времени для обеих функций.

Любая помощь будет высоко ценится. Спасибо.


person TimEckorote    schedule 11.01.2018    source источник


Ответы (1)


Вы просто делаете следующее:

func1_time = %timeit -o func1(10)

Вы можете получить доступ к времени для каждой итерации,

func1_time.timings

и общее время, затраченное на каждый цикл

func1_time.all_runs

Обратите внимание, что ваши циклы не нужны, так как %timeit выполняет ваш код N раз в цикле и повторяет этот цикл r раз.


Обновить

Если вам нужны тайминги для разных аргументов x, вы можете попробовать следующее:

func1_time = []
for i in [10, 100, 1000]:
    foo =  %timeit -o func1(x)
    func1_time.append(foo)

Затем func1_time[0].timings содержит тайминги для func1(10).

Если вы это сделаете, я рекомендую указать параметры r и N, поскольку %timeit адаптирует количество циклов к сложности задачи. Это означает, что чем больше времени требуется для своевременного выполнения функции, тем меньше циклов выполняется.

person MaxPowers    schedule 11.01.2018
comment
Спасибо МаксПауэрс! Просто чтобы я полностью понял, первая строка вашего кода позволяет %timeit измерять время, необходимое для оценки func1 @ 10, верно? Я пытаюсь оценить func1 (1), func1 (2), ...., func1 (100) и сравнить время с func2. - person TimEckorote; 11.01.2018
comment
@ Тим Это верно. Учитывая предоставленные вами функции, аргумент не имеет значения. Время, необходимое для сложения двух скаляров, не зависит от их фактических значений. Итак, нет никакой разницы между %time func1(1) и %time func1(10032). - person MaxPowers; 11.01.2018
comment
Спасибо за разъяснения. Я просто использовал эти функции в качестве примера, мои функции на самом деле имеют дело с квадратными матрицами с входными данными, x - это размер. По мере увеличения x время вычислений должно заметно увеличиваться. В этом случае я хотел бы изменить ввод. Это то, что вы имели в виду, когда упомянули N раз и r итераций? - person TimEckorote; 11.01.2018