Время за указанный период времени
Я знаю, что могу использовать timeit вот так:
timeit.timeit("f(x)", "from __main__ import f", number=100000)
И это повторится f()
100000 раз.
Тем не менее, я хотел бы сделать что-то вроде этого:
timeit.timeit("f()", "from __main__ import f", duration=5000)
Который будет повторяться f()
столько, сколько нужно, пока не достигнет 5 секунд.
Есть ли что-то подобное во времени, или мне придется самому создать цикл времени?
2 ответа
Нет, такой опции нет. Проверьте этот открытый вопрос.
Вот как это делается в timeit.main
, который вызывается, когда вы запускаете что-то вроде python -m timeit ...
(только включив сюда соответствующую часть):
if number == 0:
# determine number so that 0.2 <= total time < 2.0
for i in range(1, 10):
number = 10**i
try:
x = t.timeit(number)
except:
t.print_exc()
return 1
if verbose:
print "%d loops -> %.*g secs" % (number, precision, x)
if x >= 0.2:
break
Вы можете легко изменить его, чтобы остановить после некоторого "total_time".
При запуске из командной строки,
python -mtimeit -s'from script import f, x' 'f(x)'
timeit
Скрипт находит количество итераций, необходимое для вызова функции не менее 0,2 секунды. Эндолит объединил этот код в функцию:
def timeit_auto(stmt="pass", setup="pass", repeat=3, duration=0.2):
"""
https://stackru.com/q/19062202/190597 (endolith)
Imitate default behavior when timeit is run as a script.
Runs enough loops so that total execution time is greater than 0.2 sec,
and then repeats that 3 times and keeps the lowest value.
Returns the number of loops and the time for each loop in microseconds
"""
t = timeit.Timer(stmt, setup)
# determine number so that 0.2 <= total time < 2.0
for i in range(1, 10):
number = 10 ** i
x = t.timeit(number) # seconds
if x >= duration:
break
r = t.repeat(repeat, number)
best = min(r)
usec = best * 1e6 / number
return number, usec
Код времени в стандартной библиотеке можно найти здесь.