Я хотел бы провести сравнительный анализ с модулем timeit Python. Есть ли способ заставить timeit возвращать время как самого медленного, так и самого быстрого цикла из 1000 циклов?
Модуль timeit - получить самый быстрый и самый медленный цикл
Ответы (3)
Код довольно легко взломать. Вы должны иметь возможность скопировать timeit.py
исходный код и сохранить его. на my_timeit.py
, немного отредактируйте его, а затем используйте как новый модуль.
Вы можете видеть в строке 326, что timeit.py
делает best = min(r)
; вы можете добавить worst = max(r)
и отредактировать операторы печати ниже.
timeit
возвращает «лучшее из 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()))
Используйте функцию repeat вместо timeit
, которая возвращает список раз.