Модуль 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
Другие вопросы по тегам