Więc w Javie możemy zrobić Jak mierzyć czas potrzebny do wykonania funkcji
Ale jak to się robi w Pythonie? Aby zmierzyć czas rozpoczęcia i zakończenia między wierszami kodów? Coś, co to robi:
import some_time_library
starttime = some_time_library.some_module()
code_tobe_measured()
endtime = some_time_library.some_module()
time_taken = endtime - starttime
time.clock()
itime.clock()
mierzy czas procesora w systemie Unix, ale czas ściany w systemie Windows. Lepiej jest używać, gdytime.time()
zachowanie nie różni się w zależności od systemu operacyjnego. stackoverflow.com/questions/85451/…DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
# your code here
ztime.sleep(10)
i dostał 0,0 sekundy. Dodaniefor i in range(10000):/pass
dało te same wyniki. W każdych okolicznościach, które próbowałem,time.process_time()
zawsze zwraca tę samą liczbę. Otrzymałem oczekiwane rezultaty, używająctime.perf_counter()
jednakMożesz także skorzystać z
time
biblioteki:import time start = time.time() # your code # end print(f'Time: {time.time() - start}')
źródło
Za pomocą małej klasy wygody możesz zmierzyć czas spędzony w wierszach z wcięciem w następujący sposób:
with CodeTimer(): line_to_measure() another_line() # etc...
Który pokaże co następuje po zakończeniu wykonywania wciętej linii (wierszy):
AKTUALIZACJA: Możesz teraz uzyskać zajęcia za pomocą,
pip install linetimer
a następniefrom linetimer import CodeTimer
. Zobacz ten projekt GitHub .Kod dla powyższej klasy:
import timeit class CodeTimer: def __init__(self, name=None): self.name = " '" + name + "'" if name else '' def __enter__(self): self.start = timeit.default_timer() def __exit__(self, exc_type, exc_value, traceback): self.took = (timeit.default_timer() - self.start) * 1000.0 print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
Następnie możesz nazwać bloki kodu, które chcesz zmierzyć:
with CodeTimer('loop 1'): for i in range(100000): pass with CodeTimer('loop 2'): for i in range(100000): pass Code block 'loop 1' took: 4.991 ms Code block 'loop 2' took: 3.666 ms
I zagnieździć je:
with CodeTimer('Outer'): for i in range(100000): pass with CodeTimer('Inner'): for i in range(100000): pass for i in range(100000): pass Code block 'Inner' took: 2.382 ms Code block 'Outer' took: 10.466 ms
Odnośnie
timeit.default_timer()
, używa najlepszego timera opartego na wersji systemu operacyjnego i Pythona, zobacz tę odpowiedź .źródło
Zawsze wolę sprawdzać czas w godzinach, minutach i sekundach (% H:% M:% S):
from datetime import datetime start = datetime.now() # your code end = datetime.now() time_taken = end - start print('Time: ',time_taken)
wynik:
Time: 0:00:00.000019
źródło
Szukałem sposobu, jak wyprowadzić sformatowany czas przy użyciu minimalnego kodu, więc oto moje rozwiązanie. Wiele osób i tak korzysta z Pand, więc w niektórych przypadkach może to zaoszczędzić na dodatkowych importach bibliotek.
import pandas as pd start = pd.Timestamp.now() # code print(pd.Timestamp.now()-start)
Wynik:
0 days 00:05:32.541600
Poleciłbym użyć tego, jeśli precyzja czasu nie jest najważniejsza, w przeciwnym razie użyj
time
biblioteki:%timeit pd.Timestamp.now()
wyjścia 3,29 µs ± 214 ns na pętlę%timeit time.time()
wyjścia 154 ns ± 13,3 ns na pętlęźródło
Umieszczenie kodu w funkcji, a następnie użycie dekoratora do pomiaru czasu to kolejna opcja. ( Źródło ) Zaletą tej metody jest to, że definiujesz timer raz i używasz go z prostą dodatkową linią dla każdej funkcji.
Najpierw zdefiniuj
timer
dekoratora:import functools import time def timer(func): @functools.wraps(func) def wrapper(*args, **kwargs): start_time = time.perf_counter() value = func(*args, **kwargs) end_time = time.perf_counter() run_time = end_time - start_time print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3))) return value return wrapper
Następnie użyj dekoratora podczas definiowania funkcji:
@timer def doubled_and_add(num): res = sum([i*2 for i in range(num)]) print("Result : {}".format(res))
Spróbujmy:
doubled_and_add(100000) doubled_and_add(1000000)
Wynik:
Result : 9999900000 Finished 'doubled_and_add' in 0.0119 secs Result : 999999000000 Finished 'doubled_and_add' in 0.0897 secs
Uwaga: nie jestem pewien, dlaczego używać
time.perf_counter
zamiasttime.time
. Komentarze są mile widziane.źródło
Możesz też spróbować tego:
from time import perf_counter t0 = perf_counter() ... t1 = perf_counter() time_taken = t1 - t0
źródło