2013-07-10 9 views
10

Czasami lubię określać czas działania fragmentów kodu. Sprawdziłem wiele witryn internetowych i widziałem na ogół dwa główne sposoby, aby to zrobić. Jeden używa time.time, a drugi używa timeit.timeit.time.time vs. timeit.timeit

Więc napisałem bardzo prosty skrypt aby porównać dwa:

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)) 

Zasadniczo razy, ile czasu potrzeba, aby wydrukować „ABC” 100 razy w pętli for. Liczba po lewej stronie znajduje się wyniki dla time.time a liczba po prawej stronie jest dla 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 

Jak widać, czasami time.time jest szybsza, a czasami jest to wolniej. Który jest lepszy sposób (dokładniejszy)?

+6

'timeit' jest lepszym wyborem do rozrządu fragmentów kodu. Używa 'time.time()' ('time.clock()' dla Windows) i wyłącza garbage collector. Również jedna próba nie jest wystarczająca. – Blender

+0

@Blender: 'timeit' używa' time.perf_counter' w Pythonie 3.3+ – jfs

+0

@ J.F.Sebastian: Dzięki, nie wiedziałem o tym. – Blender

Odpowiedz

25

timeit jest bardziej dokładna, z trzech powodów:

  • powtarza prób wiele razy, aby wyeliminować wpływ innych zadań na komputerze, takich jak zaczerwienienie dysku i systemu operacyjnego planowania.
  • wyłącza funkcję czyszczenia pamięci, aby zapobiec przekrzywianiu wyników przez zaplanowanie uruchomienia kolekcji w nieodpowiednim momencie.
  • wybiera najdokładniejszy timer dla twojego OS, time.time lub time.clock w Pythonie 2 i time.perf_counter() na Pythonie 3. Zobacz timeit.default_timer.
+0

Jeśli wyraźnie robisz te trzy rzeczy, wyniki są tak dokładne, jak w przypadku timeit? Mój przypadek użycia prowadzi wiele testów z różnymi wejściami, więc wyobraź sobie, że łatwiej byłoby zrezygnować z timeit. – Annan

+1

@Annan: Po co wynaleźć to koło? Jestem pewien, że jakikolwiek przypadek użycia uda ci się wymyślić, pod warunkiem, że zrozumiesz, co oznacza ciągłe uruchamianie czegoś, może być dostarczony przez 'timeit'. Istnieje kilka mniejszych drobnych sztuczek 'timeit' (takich jak użycie' itertools.repeat (None, repetitioncount) 'dla zakresu powtórzeń o niskim współczynniku tarcia), które też musiałbyś replikować, jeśli chcesz być" dokładny " jak "timeit" dostaje. –