2009-08-10 3 views
14

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

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

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

+0

Paging Alex Martelli, Alex Martelli, прокомментируйте модуль python timeit ... – hughdbrown

+0

RichieHindle уже получил это право, когда я был в автономном режиме. И, во всяком случае, я всегда использую «python -mtimeit», никогда не теряю времени в интерактивном интерпретаторе или программе ;-) –

ответ

26

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

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

t.timeit(1) 

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

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

count = 1000 
print t.timeit(count)/count 
+6

Да! Я также рекомендую использовать 'python -mtimeit' из командной строки вместо timeit в качестве модуля - версия командной строки содержит слишком много удобных мелочей, которые вы не получаете от модуля (повторяя разное количество раз в зависимости от того, как медленный/быстрый - это то, что вы измеряете, например: отличная техника микрообъектива, жаль, что модуль не предлагает его - и т. д. и т. д .;-). –

+0

@Alex Ваш комментарий здесь не ясен. Можете ли вы уточнить, какие дополнительные функции доступны в CLI. – Tshepang

+1

@Tshepang: использование CLI тайм-аута выбирает количество повторений «магически» - мало для медленного измерения кода, больше для быстрого кода, для очень быстрого кода - красиво сбалансированная точность и время, необходимое для получения результатов. –

6

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

3

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

t.timeit(number=100) 

например.

2

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

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

+0

Спасибо всем. Очень полезно. И да, это был намеченный порядок операций. –

Смежные вопросы