2013-07-10 3 views
10

Иногда мне нравится время, сколько времени занимает часть моего кода для запуска. Я проверил множество интернет-сайтов и увидел в целом два основных способа сделать это. Один использует time.time, а другой использует timeit.timeit.time.time vs. timeit.timeit

Итак, я написал очень простой скрипт, чтобы сравнить два:

from timeit import timeit 
from time import time 
start = time() 
for i in range(100): print('ABC') 
print(time()-start, timeit("for i in range(100): print('ABC')", number=1)) 

В основном, это раз, сколько времени требуется, чтобы напечатать «ABC» 100 раз для цикла. Число слева есть результаты для time.time и номер на праве для timeit.timeit:

# First run 
0.0 0.012654680972022981 
# Second run 
0.031000137329101562 0.012747430190149865 
# Another run 
0.0 0.011262325239660349 
# Another run 
0.016000032424926758 0.012740166697164025 
# Another run 
0.016000032424926758 0.0440628627381413 

Как вы можете видеть, иногда, time.time быстрее, а иногда медленнее. Что лучше (точнее)?

+6

'timeit' - лучший выбор для временных фрагментов кода. Он использует 'time.time()' ('time.clock()' для Windows) и отключает сборщик мусора. Кроме того, одного испытания недостаточно. – Blender

+0

@Blender: 'timeit' использует' time.perf_counter' в Python 3.3+ – jfs

+0

@ J.F.Sebastian: Спасибо, я этого не знал. – Blender

ответ

25

timeit является более точным, по трем причинам:

  • повторяет ИСПЫТАНИЯ много раз, чтобы исключить влияние других задач на вашем компьютере, например, диск промывки и планирование ОС.
  • он отключает сборщик мусора, чтобы этот процесс не искажал результаты, планируя запуск коллекции в неподходящий момент.
  • он выбирает самый точный таймер для вашей ОС, time.time или time.clock в Python 2 и time.perf_counter() на Python 3. См. timeit.default_timer.
+0

Если вы явно делаете эти три вещи, вы получаете такие же точные результаты, как timeit? В моем примере использования много тестов с различными входами, поэтому, возможно, было бы проще отказаться от timeit. – Annan

+1

@ Эннан: Зачем изобретать это колесо? Я уверен, что независимо от того, что вы можете придумать, если вы понимаете, что значит многократно запускать что-либо, может быть предоставлено «timeit». Есть несколько небольших небольших трюков 'timeit' (например, использование' itertools.repeat (None, repetitioncount) 'для диапазона повторения с низким коэффициентом трения), которые вам также придется реплицировать, если вы хотите быть« точными », как 'timeit' получает. –

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