Jeśli chcesz tylko zmierzyć upływający czas zegara ściennego między dwoma punktami, możesz użyć time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Daje to czas wykonania w sekundach.
Inną opcją od wersji 3.3 może być użycie perf_counter
lub process_time
, w zależności od wymagań. Przed wersją 3.3 zalecono użycie time.clock
(dzięki Amber ). Jednak obecnie jest przestarzałe:
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ą, opartą na funkcji Win32 QueryPerformanceCounter()
. Rozdzielczość jest zwykle lepsza niż jedna mikrosekunda.
Przestarzałe od wersji 3.3 : Zachowanie tej funkcji zależy od platformy: użyj perf_counter()
lub process_time()
zamiast tego , w zależności od wymagań, aby mieć dobrze zdefiniowane zachowanie.
time.clock()
rzeczywistości jest preferowany do pomiaru wydajności , ponieważ nie można go zakłócać, jeśli zostanie zepsuty zegar systemowy, ale w.time()
większości osiąga ten sam cel.)print(timedelta(seconds=execution_time))
. Chociaż jest to osobne pytanie.Użyj
timeit.default_timer
zamiasttimeit.timeit
. Ten pierwszy zapewnia najlepszy zegar dostępny na twojej platformie i automatycznie w wersji Python:timeit.default_timer jest przypisany do time.time () lub time.clock () w zależności od systemu operacyjnego. W Pythonie 3.3+ default_timer to time.perf_counter () na wszystkich platformach. Zobacz Python - time.clock () vs. time.time () - dokładność?
Zobacz też:
źródło
default_timer() measurations can be affected by other programs running on the same machine, so the best thing to do when accurate timing is necessary is to repeat the timing a few times and use the best time. The -r option is good for this; the default of 3 repetitions is probably enough in most cases. On Unix, you can use time.clock() to measure CPU time.
perf
modułem (nieistniejącym w momencie udzielenia odpowiedzi), który zapewnia ten sam interfejs, ale czasami różni się odtimeit
decyzji modułu o tym, jak mierzyć wydajność czasową.Tylko Python 3:
Ponieważ time.clock () jest przestarzałe od wersji Python 3.3 , będziesz chciał używać
time.perf_counter()
do pomiarutime.process_time()
czasu w całym systemie lub w czasie, tak jak kiedyśtime.clock()
:Nowa funkcja
process_time
nie będzie obejmować czasu, który upłynął podczas snu.źródło
timeit.default_timer
zamiasttime.perf_counter
. Ten pierwszy wybierze odpowiedni licznik czasu, aby zmierzyć wydajność czasu dostosowaną do twojej platformy i wersji Pythona.process_time()
robi nie obejmuje czasu podczas snu, a zatem nie jest właściwe do pomiaru upływu czasu.Biorąc pod uwagę funkcję, którą chcesz ustawić czas,
test.py:
najłatwiejszym sposobem
timeit
jest wywołanie go z wiersza poleceń:Nie próbuj używać
time.time
lubtime.clock
(naiwnie) do porównywania prędkości funkcji. Mogą dawać mylące wyniki .PS. Nie umieszczaj instrukcji print w funkcji, której czas potrzebujesz; w przeciwnym razie zmierzony czas będzie zależeć od prędkości terminala .
źródło
Fajnie jest to zrobić za pomocą menedżera kontekstu, który automatycznie zapamiętuje czas rozpoczęcia po wejściu do
with
bloku, a następnie zatrzymuje czas zakończenia po wyjściu z bloku. Przy odrobinie podstępu możesz nawet uzyskać bieżącą licznik czasu, który upłynął w bloku z tej samej funkcji menedżera kontekstu.Biblioteka podstawowa tego nie ma (ale prawdopodobnie powinna). Po zainstalowaniu możesz wykonywać następujące czynności:
Oto kod menedżera kontekstu wystarczający do wykonania tej sztuczki:
I jakiś działający kod demonstracyjny:
Zauważ, że zgodnie z projektem tej funkcji, zwracana wartość
elapsed()
jest zamrożona przy wyjściu z bloku, a kolejne wywołania zwracają ten sam czas trwania (około 6 sekund w tym przykładzie zabawki).źródło
Czas pomiaru w sekundach:
Wyjście :
źródło
Wolę to.
timeit
doc jest zbyt mylące.Zauważ, że nie ma tu żadnego formatowania, właśnie napisałem
hh:mm:ss
na wydruku, aby można było zinterpretowaćtime_elapsed
źródło
Oto inny sposób, aby to zrobić:
Porównywanie w tradycyjny sposób:
Instalacja:
Więcej informacji znajduje się na stronie PyPi .
źródło
t.tic()
zakopany w kodzie, to do mnie, dewelopera, należy zapamiętanie listy miejsc, w których powinienem się tego spodziewać. Czy zdarza ci się zakładać gniazda, czy tylko wiele tictoców?ttictoc
. Miałem dość bałaganu, ale teraz powinno być dobrze.Oto moje ustalenia po przejściu wielu dobrych odpowiedzi tutaj, a także kilku innych artykułów.
Po pierwsze, jeśli debatujesz między
timeit
itime.time
,timeit
ma dwie zalety:timeit
wybiera najlepszy czasomierz dostępny w wersji systemu operacyjnego i Pythona.timeit
wyłącza zbieranie śmieci, jednak nie jest to coś, czego możesz chcieć lub nie.Problem polega na tym, że
timeit
nie jest tak prosty w użyciu, ponieważ wymaga konfiguracji, a rzeczy stają się brzydkie, gdy masz wiele importów. Idealnie potrzebujesz po prostu dekoratora lub użyjwith
bloku i zmierz czas. Niestety, nie ma w tym nic wbudowanego, więc masz dwie opcje:Opcja 1: Użyj biblioteki timebudget
Timebudget jest wszechstronnym i bardzo prosty biblioteki, który można wykorzystać tylko w jednym wierszu kodu po pip zainstalować.
Opcja 2: użyj modułu kodu bezpośrednio
Stworzyłem poniżej mały moduł narzędziowy.
Teraz możesz ustawić czas dowolnej funkcji, umieszczając przed nią dekorator:
Jeśli chcesz odmierzyć fragment kodu, po prostu włóż go do
with
bloku:Zalety:
Krąży kilka wersji z półprawą, więc chcę wskazać kilka najważniejszych:
with utils.MeasureBlockTime() as t
a następniet.elapsed
).źródło
Użycie
time.time
do pomiaru wykonania daje ogólny czas wykonania poleceń, w tym czas działania innych procesów na komputerze. Jest to czas, który użytkownik zauważa, ale nie jest to dobre, jeśli chcesz porównać różne fragmenty kodu / algorytmy / funkcje / ...Więcej informacji na temat
timeit
:Jeśli chcesz uzyskać głębszy wgląd w profilowanie:
Aktualizacja : W ciągu ostatniego roku często korzystałem z http://pythonhosted.org/line_profiler/ i uważam, że jest bardzo pomocny i zalecam używanie go zamiast modułu profilu Pythona.
źródło
Oto mała klasa timera, która zwraca ciąg „hh: mm: ss”:
Stosowanie:
źródło
Pythonowe moduły cProfile i pstats oferują doskonałą obsługę pomiaru czasu, jaki upłynął w niektórych funkcjach, bez konieczności dodawania kodu do istniejących funkcji.
Na przykład, jeśli masz skrypt Python timeFunctions.py:
Aby uruchomić profiler i wygenerować statystyki dla pliku, wystarczy uruchomić:
Działa to za pomocą modułu cProfile do profilowania wszystkich funkcji w timeFunctions.py i gromadzenia statystyk w pliku timeStats.profile. Zauważ, że nie musieliśmy dodawać żadnego kodu do istniejącego modułu (timeFunctions.py) i można to zrobić za pomocą dowolnego modułu.
Po utworzeniu pliku statystyk możesz uruchomić moduł pstats w następujący sposób:
Spowoduje to uruchomienie interaktywnej przeglądarki statystyk, która zapewnia wiele fajnych funkcji. W konkretnym przypadku użycia możesz po prostu sprawdzić statystyki swojej funkcji. W naszym przykładzie sprawdzenie statystyk dla obu funkcji pokazuje nam:
Przykładowy manekin nie robi wiele, ale daje wyobrażenie o tym, co można zrobić. Najlepsze w tym podejściu jest to, że nie muszę edytować żadnego z moich istniejących kodów, aby uzyskać te liczby i oczywiście pomóc w profilowaniu.
źródło
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
sprawdź swoją wersję Pythona, której używasz. Mam to, kiedy pobiegłempython3 -m cProfile...
ipython -m pstats
. Mój błąd, ale dostałem go na sekundę, więc chciałem się podzielićdon't forget consistency
. =)Oto inny menedżer kontekstu dla kodu czasu -
Stosowanie:
lub, jeśli potrzebujesz wartości czasu
benchmark.py :
Na podstawie http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
źródło
Użyj modułu profilera. Daje bardzo szczegółowy profil.
wyprowadza coś takiego:
Uważam to za bardzo pouczające.
źródło
main()
? Przydałby się prosty przykład kodu.Podoba mi się to proste (python 3):
Dane wyjściowe są w mikrosekundach dla pojedynczego wykonania:
Objaśnienie : timeit domyślnie wykonuje anonimową funkcję 1 milion razy , a wynik podaje się w sekundach . Dlatego wynik dla jednego pojedynczego wykonania jest taki sam, ale średnio w mikrosekundach .
W przypadku powolnych operacji dodaj mniejszą liczbę iteracji lub możesz czekać wiecznie:
Dane wyjściowe są zawsze w sekundach dla całkowitej liczby iteracji:
źródło
(Tylko w przypadku Ipython) możesz użyć % timeit do zmierzenia średniego czasu przetwarzania:
i wtedy:
wynikiem jest coś takiego:
źródło
Jeszcze jeden sposób użycia timeit :
źródło
na python3:
elegancki i krótki.
źródło
Coś w rodzaju super późniejszej odpowiedzi, ale może komuś służy. Jest to sposób na zrobienie tego, co moim zdaniem jest super czyste.
Pamiętaj, że „print” jest funkcją w Pythonie 3, a nie w Pythonie 2.7. Działa jednak z każdą inną funkcją. Twoje zdrowie!
źródło
Możesz użyć timeit.
Oto przykład, jak przetestować naive_func, który pobiera parametr za pomocą Python REPL:
Nie potrzebujesz funkcji otoki, jeśli funkcja nie ma żadnych parametrów.
źródło
lambda
Byłoby bardziej zwięźle:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
Możemy również przekształcić czas w czas czytelny dla człowieka.
źródło
Stworzyłem bibliotekę do tego, jeśli chcesz zmierzyć funkcję, możesz po prostu zrobić to w ten sposób
https://github.com/Karlheinzniebuhr/pythonbenchmark
źródło
Aby uzyskać wgląd w każde wywołanie funkcji rekurencyjnie, wykonaj:
Po prostu pobiera te 2 linie kodu w notatniku Jupyter i generuje ładny interaktywny diagram. Na przykład:
Oto kod. Ponownie, 2 linie zaczynające się od
%
są jedynymi dodatkowymi liniami kodu potrzebnymi do użycia snakeviz:Wydaje się również możliwe uruchamianie snakeviz poza notebookami. Więcej informacji na stronie snakeviz .
źródło
źródło
To unikalne podejście klasowe oferuje reprezentację drukowalnego ciągu, konfigurowalne zaokrąglanie i wygodny dostęp do upływającego czasu jako ciąg lub zmiennoprzecinkowe. Został opracowany w Pythonie 3.7.
Stosowanie:
źródło
Zmierz czas wykonania małych fragmentów kodu.
Źródło Python Docs !
źródło
Jeśli chcesz mieć wygodny czas, możesz użyć prostego dekoratora:
Możesz go użyć w funkcji, której czas chcesz ustawić w następujący sposób:
Następnie za każdym razem, gdy zadzwonisz
function_to_time
, wydrukuje, ile czasu to zajęło i nazwa funkcji, która jest mierzona.źródło
na podstawie rozwiązania kontekstowego menedżera podanego przez https://stackoverflow.com/a/30024601/5095636 , poniżej wersji darmowej lambda, ponieważ flake8 ostrzega przed użyciem lambda zgodnie z E731 :
test:
źródło
Oto całkiem udokumentowany iw pełni podpowiedzi dekorator, którego używam jako ogólnego narzędzia:
Przykładowe użycie:
Dokumenty można sprawdzić za pomocą:
A typ wskazuje na:
źródło
Callable[[AnyF], AnyF]
. Co to znaczy?AnyF
oznaczaćCallable[..., Any]
, więcAnyF
jest funkcją, która może mieć dowolną ilość dowolnych argumentów typu i zwraca niczego. WięcCallable[[AnyF], AnyF]
rozwinąłbym się doCallable[[Callable[..., Any]], Callable[..., Any]]
. Jest to typ zwracanej wartościtimer
aka pełnego typudecorator
. Jest to funkcja, która przyjmuje jako argument dowolny rodzaj funkcji i zwraca dowolną funkcję.Jedyny sposób, w jaki mogę myśleć, to używanie
time.time()
.Mam nadzieję, że to pomoże.
źródło