Którego lepiej używać do pomiaru czasu w Pythonie? time.clock () czy time.time ()? Który zapewnia większą dokładność?
na przykład:
start = time.clock()
... do something
elapsed = (time.clock() - start)
vs.
start = time.time()
... do something
elapsed = (time.time() - start)
time.clock()
jest przestarzałe i zaleca się użycieperf_counter()
lubprocess_time()
zamiast niego.timeit.default_timer()
do pomiaru wydajności (jest on przypisany do time.time () lub time.clock () w zależności od systemu operacyjnego) .time.clock
atime.process_time
, ale procesy potomne nie są. Zobacz także omówienie precyzji (oczywiście zależy od systemu).Odpowiedzi:
Od wersji 3.3 funkcja time.clock () jest przestarzała i sugeruje się użycie zamiast niej time.process_time () lub time.perf_counter () .
Wcześniej w wersji 2.7, zgodnie z dokumentacją modułu czasu :
Dodatkowo istnieje moduł timeit do testowania fragmentów kodu.
źródło
time.clock()
było zależne od platformy itime.process_time()
tak nie jest. To jest powód, dla któregotime.clock()
został wycofany.Krótka odpowiedź brzmi: przez większość czasu
time.clock()
będzie lepiej. Jeśli jednak mierzysz czas sprzętem (na przykład algorytm, który umieściłeś w GPU),time.clock()
pozbędziesz się tego czasu itime.time()
jest to jedyne dostępne rozwiązanie.Uwaga: bez względu na zastosowaną metodę, czas zależy od czynników, których nie możesz kontrolować (kiedy proces będzie się zmieniał, jak często, ...), jest gorzej z,
time.time()
ale istnieje również ztime.clock()
, więc nigdy nie powinieneś uruchamiać tylko jednego testu czasu, ale zawsze przeprowadzaj serię testów i sprawdzaj średnią / wariancję czasów.źródło
Inne odpowiedziałeś re:
time.time()
wersetachtime.clock()
.Jeśli jednak planujesz wykonanie bloku kodu na potrzeby testów porównawczych / profilowania, powinieneś spojrzeć na
timeit
moduł .źródło
timeit.default_timer
jest przypisany dotime.time()
lub wtime.clock()
zależności od systemu operacyjnego. W Python 3.3+default_timer
jesttime.perf_counter()
na wszystkich platformach.Należy pamiętać o jednej rzeczy: zmiana czasu systemowego wpływa,
time.time()
ale nie wpływatime.clock()
.Musiałem kontrolować niektóre automatyczne testy. Jeśli jeden krok przypadku testowego trwał dłużej niż określony czas, ten TC został przerwany, aby przejść do następnego.
Czasami jednak potrzebny jest krok do zmiany czasu systemowego (w celu sprawdzenia modułu harmonogramu testowanej aplikacji), więc po ustawieniu czasu systemowego na kilka godzin w przyszłości upłynął limit czasu TC i przypadek testowy został przerwany. Musiałem przełączyć się z
time.time()
na,time.clock()
aby poradzić sobie z tym poprawnie.źródło
clock()
-> liczba zmiennoprzecinkowaZwróć czas procesora lub czas rzeczywisty od początku procesu lub od pierwszego połączenia z
clock()
. Ma to tyle samo precyzji, co zapis systemu.time()
-> liczba zmiennoprzecinkowaZwróć bieżący czas w sekundach od Epoki. Ułamki sekundy mogą być obecne, jeśli zapewnia je zegar systemowy.
Zwykle
time()
jest bardziej precyzyjny, ponieważ systemy operacyjne nie przechowują czasu działania procesu z dokładnością, jaką przechowują czas systemowy (tj. Rzeczywisty czas)źródło
Zależy od tego, na czym ci zależy. Jeśli masz na myśli CZAS ŚCIANY (jak w, czas na zegarze na ścianie), time.clock () nie zapewnia dokładności, ponieważ może zarządzać czasem procesora.
źródło
time.clock()
na serwerach Linuksa, a liczby, które dostałem, zdecydowanie nie były sekundamitime()
ma lepszą precyzję niżclock()
w systemie Linux.clock()
ma precyzję mniejszą niż 10 ms. Choćtime()
daje prefekt precyzji. Mój test dotyczy CentOS 6.4, Python 2.6using clock():
źródło
Różnica zależy od platformy.
Na przykład clock () bardzo różni się w systemie Windows niż w systemie Linux.
W przypadku przykładów, które opisujesz, prawdopodobnie zamiast tego potrzebujesz modułu „timeit”.
źródło
clock
jest"very different"
?Jako inne zauważyli
time.clock()
jest zastąpionatime.perf_counter()
lubtime.process_time()
, ale Python 3,7 wprowadza nanosekund z rozdzielczością czasowątime.perf_counter_ns()
,time.process_time_ns()
itime.time_ns()
wraz z 3 innymi funkcjami.Te 6 nowych funkcji rozdzielczości nansecond opisano szczegółowo w PEP 564 :
Jak zauważyli inni, użyj
timeit
modułu do pomiaru czasu i małych fragmentów kodu.źródło
Na Unix time.clock () mierzy czas procesora, który został wykorzystany przez bieżący proces, więc nie jest dobry do mierzenia czasu, który upłynął od pewnego momentu w przeszłości. W systemie Windows będzie mierzył sekundy zegara ściennego, które upłynęły od pierwszego wywołania funkcji. W obu systemach time.time () zwróci sekundy upływające od epoki.
Jeśli piszesz kod przeznaczony tylko dla systemu Windows, jeden z nich będzie działał (chociaż będziesz używać tych dwóch w różny sposób - funkcja time.clock () nie wymaga odejmowania). Jeśli ma to działać w systemie Unix lub chcesz mieć kod, który ma być przenośny, będziesz chciał użyć time.time ().
źródło
Krótka odpowiedź: użyj time.clock () do pomiaru czasu w Pythonie.
W systemach * nix funkcja clock () zwraca czas procesora jako liczbę zmiennoprzecinkową wyrażoną w sekundach. W systemie Windows zwraca sekundy, które upłynęły od pierwszego wywołania tej funkcji, jako liczbę zmiennoprzecinkową.
time () zwraca liczbę sekund od epoki, w UTC, jako liczbę zmiennoprzecinkową. Nie ma gwarancji, że uzyskasz lepszą precyzję niż 1 sekunda (nawet jeśli time () zwraca liczbę zmiennoprzecinkową). Należy również pamiętać, że jeśli zegar systemowy został cofnięty między dwoma wywołaniami tej funkcji, drugie wywołanie funkcji zwróci niższą wartość.
źródło
O ile mi wiadomo, time.clock () ma tyle precyzji, na ile pozwala na to twój system.
źródło
Używam tego kodu do porównania 2 metod. Mój system operacyjny to Windows 8, rdzeń procesora i5, RAM 4 GB
wynik:
czas () = 0,0993799996376
clock () = 0,0993572257367
źródło
Prawidłowa odpowiedź: obie są tej samej długości ułamka.
Ale który jest szybszy, jeśli
subject
jesttime
?Mały przypadek testowy :
Nie pracuję w szwajcarskich laboratoriach, ale przetestowałem ...
Na podstawie tego pytania:
time.clock()
jest lepszy niżtime.time()
Edycja:
time.clock()
jest wewnętrznym licznikiem, więc nie można go używać na zewnątrz, ma ograniczeniamax 32BIT FLOAT
, nie może kontynuować liczenia, jeśli nie zapisze pierwszych / ostatnich wartości. Nie można scalić kolejnego licznika ...źródło
time.clock()
został usunięty w Pythonie 3.8, ponieważ miał zachowanie zależne od platformy :W systemie Windows ta funkcja zwraca sekundy zegarowe, które upłynęły od pierwszego wywołania tej funkcji, jako liczbę zmiennoprzecinkową
Którą funkcję wybrać zamiast tego?
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
Porównywanie wyników testu między Ubuntu Linux a Windows 7.
Na Ubuntu
W systemie Windows 7
źródło