Модуль timeit - получите самый быстрый и самый медленный цикл
Я хотел бы сделать несколько сравнительных тестов с модулем timeit в Python. Есть ли способ заставить timeit возвращать время для самого медленного, а также самого быстрого цикла из 1000 циклов?
4 ответа
Код довольно легко взломать. Вы должны быть в состоянии скопировать timeit.py
Исходный код, сохраните его в my_timeit.py
слегка отредактируйте его, а затем используйте как новый модуль.
В строке 326 видно, что timeit.py
делает best = min(r)
; Вы можете добавить в worst = max(r)
и отредактируйте операторы печати ниже.
timeit
возвращает "best of 3", то есть есть два параметра: один указывает количество итераций в цикле, другой - сколько раз повторять цикл. Результат, который передается min()
время на цикл, а не на итерацию цикла.
Смысл повторения цикла состоит в том, чтобы исключить влияние других процессов в той же системе - из документов (help('timeit')
):
Лучшее, что нужно сделать, когда требуется точное время, - это повторить его несколько раз и использовать лучшее время. Опция -r хороша для этого; по умолчанию 3 повторения, вероятно, достаточно в большинстве случаев.
Нет смысла повторять измерения 1000 раз. Вы, вероятно, хотели указать 1000 итераций для одного цикла (по умолчанию 1000000).
Полезен только самый быстрый цикл (минимальное время) - от help('timeit.Timer.repeat')
:
Примечание: заманчиво рассчитать среднее и стандартное отклонение от вектора результатов и сообщить о них. Однако это не очень полезно. В типичном случае самое низкое значение дает нижнюю границу для того, насколько быстро ваша машина может выполнить данный фрагмент кода; более высокие значения в векторе результатов, как правило, вызваны не изменчивостью скорости Python, а другими процессами, влияющими на точность синхронизации. Таким образом, min() результата, вероятно, является единственным числом, которое вас должно заинтересовать. После этого вы должны смотреть на весь вектор и применять здравый смысл, а не статистику.акцент мой
т.е. самый медленный цикл указывает, насколько другие процессы могут мешать измерениям.
#!/usr/bin/env python
import timeit
def your_function():
"do something"
t = timeit.Timer(your_function)
# repeat 10 times, 1000000 times through the loop
repeat, number = 10, 1000000
r = t.repeat(repeat, number)
best, worse = min(r), max(r)
print("{number} loops, best of {repeat}: {best:.3g} seconds per loop, "
"worse of {repeat}: {worse:.3g} seconds per loop".format(**vars()))
Используйте функцию повтора вместо timeit
, которые возвращают список раз.
Как насчет использованияtimeit.repeat
res = timeit.repeat('"-".join(str(n) for n in range(1000))', number=1, repeat=10)
fastest = min(res)
slowest = max(res)
Если вам нужно несколько выполнений (скажем) для каждого повтора, не забудьте разделить результаты на
n
n = 100
res = timeit.repeat('"-".join(str(n) for n in range(1000))', number=n, repeat=10)
fastest = min(res)/n
slowest = max(res)/n
print(fastest, slowest)
# Out:
# 0.00020186356006888674 0.0002322985901264474