Модуль timeit - получить самый быстрый и самый медленный цикл

Я хотел бы провести сравнительный анализ с модулем timeit Python. Есть ли способ заставить timeit возвращать время как самого медленного, так и самого быстрого цикла из 1000 циклов?


person Don Polettone    schedule 07.11.2015    source источник


Ответы (3)


Код довольно легко взломать. Вы должны иметь возможность скопировать timeit.py исходный код и сохранить его. на my_timeit.py, немного отредактируйте его, а затем используйте как новый модуль.

Вы можете видеть в строке 326, что timeit.py делает best = min(r); вы можете добавить worst = max(r) и отредактировать операторы печати ниже.

person bbayles    schedule 07.11.2015

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()))
person jfs    schedule 07.11.2015

Используйте функцию repeat вместо timeit, которая возвращает список раз.

person memoselyk    schedule 07.11.2015