python: медленная функция timeit()

Когда я запускаю приведенный ниже код вне timeit(), кажется, что он завершается мгновенно. Однако, когда я запускаю его в функции timeit(), это занимает гораздо больше времени. Почему?

>>> import timeit
>>> t = timeit.Timer("3**4**5")
>>> t.timeit()
16.55522028637718

Использование: Python 3.1 (x86) — AMD Athlon 64 X2 — WinXP (32-разрядная версия)


person HC.    schedule 10.08.2009    source источник
comment
Пейджинг Алекс Мартелли, Алекс Мартелли, пожалуйста, прокомментируйте модуль python timeit...   -  person hughdbrown    schedule 11.08.2009
comment
RichieHindle уже понял это, пока я не был в сети. И я все равно всегда использую python -mtimeit, никогда не использую timeit в интерактивном интерпретаторе или программе ;-)   -  person Alex Martelli    schedule 11.08.2009


Ответы (4)


Функция timeit() запускает код много раз (по умолчанию один миллион) и берет среднее значение времени.

Чтобы запустить код только один раз, сделайте следующее:

t.timeit(1)

но это даст вам искаженные результаты - это повторяется не зря.

Чтобы получить время цикла, позволив ему повториться, разделите результат на количество циклов. Используйте меньшее значение количества повторов, если одного миллиона слишком много:

count = 1000
print t.timeit(count) / count
person RichieHindle    schedule 10.08.2009
comment
Ага! Я также рекомендую использовать python -mtimeit из командной строки вместо timeit в качестве модуля — в версии для командной строки слишком много удобных мелочей, которые вы не получаете из модуля (повторяется различное количество раз в зависимости от того, насколько медленно/быстро выполняется то, что вы измеряете, например: отличный метод микробенчмаркинга, жаль, что модуль не предлагает его - и т. д., и т. д. ;-). - person Alex Martelli; 11.08.2009
comment
@Alex Ваш комментарий здесь мне не ясен. Не могли бы вы уточнить, какие дополнительные функции доступны в интерфейсе командной строки. - person tshepang; 28.04.2010
comment
@Tshepang: CLI использует timeit волшебным образом выбирает количество повторений - мало для измеряемого медленного кода, больше для более быстрого кода, много для очень быстрого кода - прекрасно уравновешивая точность и время, необходимое для получения результатов. - person Alex Martelli; 28.04.2010
comment
@Alex: вот это круто. Спасибо, что поделился. Эта часть информации должна быть более явно указана в справочнике по библиотеке. В любом случае, вы также сказали, что есть и другие отличные функции; что это? - person tshepang; 28.04.2010
comment
@Alex: в версии для командной строки слишком много удобных мелочей, которых вы не получаете из модуля, как будто их было больше; может быть, это придирки, но не могли бы вы уточнить эту часть (или просто отредактировать ее). - person tshepang; 29.04.2010
comment
@Tshepang: запустите python -mtimeit -h, чтобы получить полную документацию. (И Алекс не может редактировать свой комментарий — комментарии доступны для редактирования только в течение короткого времени после их первого создания.) - person RichieHindle; 29.04.2010

Потому что timeit по умолчанию запускает его миллион раз. Суть в том, чтобы делать микротесты, а единственный способ получить точное время коротких событий — повторять их много раз.

person Ned Batchelder    schedule 10.08.2009

Согласно документам, Timer.timeit() по умолчанию запускает ваш код миллион раз. . Используйте параметр «число», чтобы изменить это значение по умолчанию:

t.timeit(number=100)

Например.

person Jeff Bradberry    schedule 10.08.2009

Timeit по умолчанию работает в течение одного миллиона циклов.

У вас также могут быть проблемы с порядком операций: (3**4)**5 != 3**4**5.

person A B    schedule 10.08.2009
comment
Спасибо всем. Очень полезно. И да, это был предполагаемый порядок действий. - person HC.; 11.08.2009