Uwaga: każda użyta odpowiedź time.time()jest niepoprawna. Najprostszym przykładem jest zmiana czasu systemowego w okresie pomiaru.
OrangeDog,
W przypadku twojego pierwotnego pytania dotyczącego odpalenia zdarzenia, jeśli kursor pozostaje przez pewien czas w widżecie, docs.python.org/3/library/threading.html zapewnia wszystko, czego potrzebujesz. Jednym z rozwiązań może być wielowątkowość i zmienna warunkowa z limitem czasu. Twoja sytuacja jest jednak obecnie niejasna.
Tora,
2
Nie ma powodu, dla którego ktoś powinien używać time.time()do pomiaru czasu, jaki upłynął we współczesnym pythonie (na który wpływ mają ręczne zmiany, dryf, sekundy przestępne itp.). Poniższa odpowiedź musi być wyższa, biorąc pod uwagę, że to pytanie jest obecnie najlepszym wynikiem w Google pod względem pomiaru upływu czasu.
Warto dodać / zauważyć, że jednostką miary dla upływu czasu będą sekundy.
Eric Kramer
4
@EricKramer dziękuję! moje ogromne zwierzę domowe, wyjaśniające pomiary bez określania jednostki miary. I jako gość .NET po raz pierwszy zanurzający palce w Pythonie, automatycznie pomyślałem „milisekundy”.
Adam Plocher
2
Nie działa, jeśli (np.) Zegar systemowy został zmieniony i może nie mieć rozdzielczości drugiej sekundy. Prawidłowa odpowiedź: stackoverflow.com/a/47637891/476716
OrangeDog
97
time.time() wykona robotę.
import time
start = time.time()# run your code
end = time.time()
elapsed = end - start
Możesz przyjrzeć się temu pytaniu, ale nie sądzę, aby było to konieczne.
time.time()to zły pomysł, ponieważ zegar systemowy można zresetować, co spowoduje cofnięcie się w czasie. time.monotonic()dba o to (monotoniczny = idzie tylko do przodu). time.perf_counter()jest również monotoniczny, ale ma jeszcze wyższą dokładność, dlatego jest to zalecane w przypadku zegara ściennego.
xjcl
76
Dla użytkowników, którzy chcą lepszego formatowania,
import time
start_time = time.time()# your script
elapsed_time = time.time()- start_time
time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
wydrukuje przez 2 sekundy:
'00:00:02'
i przez 7 minut jedna sekunda:
'00:07:01'
zwróć uwagę, że minimalna jednostka czasu z gmtime to sekundy. Jeśli potrzebujesz mikrosekund, rozważ następujące kwestie:
import datetime
start = datetime.datetime.now()# some code
end = datetime.datetime.now()
elapsed = end - start
print(elapsed)# orprint(elapsed.seconds,":",elapsed.microseconds)
Dziękuję za odpowiedź, która mnie inspiruje. Mam zamiar użyć, e = time.time() - start_time ; print("%02d:%02d:%02d" % (e // 3600, (e % 3600 // 60), (e % 60 // 1)))że plony są prawie takie same, a także obejmują sytuację, która upłynęła ponad 24 godziny.
Tora
@Tora możesz wypróbować format „{}”. () Zamiast% 02d w celu uzyskania informacji na temat przyszłych problemów ze zgodnością.
Rutger Hofste
2
Dziękuję Ci! Teraz przyzwyczajam się do nowego. „{: 02d}: {: 02d}: {: 02d}”. Format (e // 3600, (e% 3600 // 60), e% 60)
Tora
czy możesz użyć time.monotonic()jak w innych odpowiedziach?
endolith,
elapsed.secondsbędzie niepoprawna, jeśli czas trwania będzie dłuższy niż jeden dzień. Chcesz elapsed.total_seconds()być odporny
Ash Berlin-Taylor
51
Aby uzyskać najlepszą miarę upływu czasu (od Python 3.3), użyj time.perf_counter().
Zwraca wartość (w ułamkach sekund) licznika wydajności, tj. Zegara o najwyższej dostępnej rozdzielczości do pomiaru krótkotrwałego. Obejmuje czas, który upłynął podczas snu i obejmuje cały system. Punkt odniesienia zwracanej wartości jest niezdefiniowany, dlatego ważna jest tylko różnica między wynikami kolejnych wywołań.
W przypadku pomiarów rzędu godzin / dni nie przejmujesz się rozdzielczością poniżej sekundy, więc użyj time.monotonic()zamiast tego.
Zwraca wartość (w ułamkach sekund) zegara monotonicznego, tj. Zegara, który nie może się cofnąć. Aktualizacje zegara systemowego nie mają wpływu na zegar. Punkt odniesienia zwracanej wartości jest niezdefiniowany, dlatego ważna jest tylko różnica między wynikami kolejnych wywołań.
W wielu implementacjach mogą to być faktycznie to samo.
W systemie Unix zwróć bieżący czas procesora jako liczbę zmiennoprzecinkową wyrażoną w sekundach. Precyzja, a właściwie sama definicja znaczenia „czasu procesora”, zależy od funkcji C o tej samej nazwie.
W systemie Windows funkcja ta zwraca sekundy zegara, które upłynęły od pierwszego wywołania tej funkcji, jako liczbę zmiennoprzecinkową, na podstawie funkcji Win32 QueryPerformanceCounter (). Rozdzielczość jest zwykle lepsza niż jedna mikrosekunda.
Aktualizacja dla Python 3.7
Nowością w Python 3.7 jest PEP 564 - Dodaj nowe funkcje czasowe o rozdzielczości nanosekundowej.
Korzystanie z nich może dodatkowo wyeliminować błędy zaokrąglania i zmiennoprzecinkowe, szczególnie jeśli mierzysz bardzo krótkie okresy lub aplikacja (lub komputer z systemem Windows) działa długo.
Rozdzielczość zaczyna się załamywać perf_counter()po około 100 dniach. Na przykład po roku nieprzerwanej pracy najkrótszy przedział (większy niż 0), który można zmierzyć, będzie większy niż w momencie rozpoczęcia.
„W wielu implementacjach mogą to być w rzeczywistości to samo”. To prawda, że na moim Linux Mint PC time.monotonic () i time.perf_counter () zwracają identyczne wartości.
xjcl
7
Na dłuższy okres.
import time
start_time = time.time()...
e = int(time.time()- start_time)print('{:02d}:{:02d}:{:02d}'.format(e //3600,(e %3600//60), e %60))
wydrukuje
00:03:15
jeśli więcej niż 24 godziny
25:33:57
Jest to inspirowane odpowiedzią Rutger Hofste. Dziękuję Rutger!
Musisz zaimportować czas, a następnie użyć metody time.time (), aby poznać aktualny czas.
import time
start_time=time.time()#taking current time as starting time#here your code
elapsed_time=time.time()-start_time #again taking current time - starting time
Innym fajnym sposobem na określenie czasu jest użycie struktury z pythonem.
ze strukturą automatycznie wywołuje metody __enter__ i __exit__ , co jest dokładnie tym, czego potrzebujemy do pomiaru czasu.
Stwórzmy timera klasę.
from time import time
classTimer():def __init__(self, message):
self.message = message
def __enter__(self):
self.start = time()returnNone# could return anything, to be used like this: with Timer("Message") as value:def __exit__(self, type, value, traceback):
elapsed_time =(time()- self.start)*1000print(self.message.format(elapsed_time))
Następnie można użyć klasy Timer w następujący sposób:
withTimer("Elapsed time to compute some prime numbers: {}ms"):
primes =[]for x in range(2,500):ifnot any(x % p ==0for p in primes):
primes.append(x)print("Primes: {}".format(primes))
W programowaniu istnieją 2 główne sposoby pomiaru czasu , z różnymi wynikami:
>>>print(time.process_time()); time.sleep(10);print(time.process_time())0.117513940000000010.11764988400000001# took 0 seconds and a bit>>>print(time.perf_counter()); time.sleep(10);print(time.perf_counter())3972.4657703263982.468109075# took 10 seconds and a bit
Czas procesora : tyle czasu ten konkretny proces spędza aktywnie wykonywany na procesorze. Uśpienie, oczekiwanie na żądanie sieciowe lub czas, w którym wykonywane są tylko inne procesy, nie przyczyni się do tego.
Posługiwać się time.process_time()
Czas naścienny : Odnosi się do tego, ile czasu minęło „na zegarze wiszącym na ścianie”, tj. Poza czasem rzeczywistym.
Posługiwać się time.perf_counter()
time.time() mierzy również czas naścienny, ale można go zresetować, aby można było cofnąć się w czasie
time.monotonic() nie można go zresetować (monotoniczny = tylko idzie do przodu), ale ma mniejszą dokładność niż time.perf_counter()
time.time()
jest niepoprawna. Najprostszym przykładem jest zmiana czasu systemowego w okresie pomiaru.time.time()
do pomiaru czasu, jaki upłynął we współczesnym pythonie (na który wpływ mają ręczne zmiany, dryf, sekundy przestępne itp.). Poniższa odpowiedź musi być wyższa, biorąc pod uwagę, że to pytanie jest obecnie najlepszym wynikiem w Google pod względem pomiaru upływu czasu.time.time()
.Odpowiedzi:
Możesz także napisać prosty dekorator, aby uprościć pomiar czasu wykonywania różnych funkcji:
Stosowanie:
Możesz profilować więcej niż jedną funkcję jednocześnie. Następnie, aby wydrukować pomiary, po prostu wywołaj print_prof_data ():
źródło
pip install profilehooks
i ich stronę główną tutajtime.monotonic()
raczej używać niż dotime.time()
pomiaru limitów czasu lub czasów trwania. docs.python.org/3/library/time.html#time.monotonictime.time()
wykona robotę.Możesz przyjrzeć się temu pytaniu, ale nie sądzę, aby było to konieczne.
źródło
time.time()
to zły pomysł, ponieważ zegar systemowy można zresetować, co spowoduje cofnięcie się w czasie.time.monotonic()
dba o to (monotoniczny = idzie tylko do przodu).time.perf_counter()
jest również monotoniczny, ale ma jeszcze wyższą dokładność, dlatego jest to zalecane w przypadku zegara ściennego.Dla użytkowników, którzy chcą lepszego formatowania,
wydrukuje przez 2 sekundy:
i przez 7 minut jedna sekunda:
zwróć uwagę, że minimalna jednostka czasu z gmtime to sekundy. Jeśli potrzebujesz mikrosekund, rozważ następujące kwestie:
dokumentacja strftime
źródło
e = time.time() - start_time ; print("%02d:%02d:%02d" % (e // 3600, (e % 3600 // 60), (e % 60 // 1)))
że plony są prawie takie same, a także obejmują sytuację, która upłynęła ponad 24 godziny.time.monotonic()
jak w innych odpowiedziach?elapsed.seconds
będzie niepoprawna, jeśli czas trwania będzie dłuższy niż jeden dzień. Chceszelapsed.total_seconds()
być odpornyAby uzyskać najlepszą miarę upływu czasu (od Python 3.3), użyj
time.perf_counter()
.W przypadku pomiarów rzędu godzin / dni nie przejmujesz się rozdzielczością poniżej sekundy, więc użyj
time.monotonic()
zamiast tego.W wielu implementacjach mogą to być faktycznie to samo.
Przed 3.3, utkniesz z
time.clock()
.Aktualizacja dla Python 3.7
Nowością w Python 3.7 jest PEP 564 - Dodaj nowe funkcje czasowe o rozdzielczości nanosekundowej.
Korzystanie z nich może dodatkowo wyeliminować błędy zaokrąglania i zmiennoprzecinkowe, szczególnie jeśli mierzysz bardzo krótkie okresy lub aplikacja (lub komputer z systemem Windows) działa długo.
Rozdzielczość zaczyna się załamywać
perf_counter()
po około 100 dniach. Na przykład po roku nieprzerwanej pracy najkrótszy przedział (większy niż 0), który można zmierzyć, będzie większy niż w momencie rozpoczęcia.Aktualizacja dla Python 3.8
time.clock
już nie ma.źródło
Na dłuższy okres.
wydrukuje
jeśli więcej niż 24 godziny
Jest to inspirowane odpowiedzią Rutger Hofste. Dziękuję Rutger!
źródło
Musisz zaimportować czas, a następnie użyć metody time.time (), aby poznać aktualny czas.
źródło
Innym fajnym sposobem na określenie czasu jest użycie struktury z pythonem.
ze strukturą automatycznie wywołuje metody __enter__ i __exit__ , co jest dokładnie tym, czego potrzebujemy do pomiaru czasu.
Stwórzmy timera klasę.
Następnie można użyć klasy Timer w następujący sposób:
Wynik jest następujący:
Liczby pierwsze: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 , 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227 , 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373 , 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499]
Upłynął czas obliczenia niektórych liczb pierwszych: 5.01704216003418ms
źródło
Odpowiedź Vadima Shendera jest świetna. Możesz także użyć prostszego dekoratora, takiego jak poniżej:
źródło
W programowaniu istnieją 2 główne sposoby pomiaru czasu , z różnymi wynikami:
Czas procesora : tyle czasu ten konkretny proces spędza aktywnie wykonywany na procesorze. Uśpienie, oczekiwanie na żądanie sieciowe lub czas, w którym wykonywane są tylko inne procesy, nie przyczyni się do tego.
time.process_time()
Czas naścienny : Odnosi się do tego, ile czasu minęło „na zegarze wiszącym na ścianie”, tj. Poza czasem rzeczywistym.
Posługiwać się
time.perf_counter()
time.time()
mierzy również czas naścienny, ale można go zresetować, aby można było cofnąć się w czasietime.monotonic()
nie można go zresetować (monotoniczny = tylko idzie do przodu), ale ma mniejszą dokładność niżtime.perf_counter()
źródło
Oto aktualizacja sprytnego kodu Vadima Shendera z tabelarycznym wynikiem:
źródło