Mam program wiersza polecenia w języku Python, którego ukończenie zajmuje trochę czasu. Chcę wiedzieć, ile czasu zajmuje ukończenie biegu.
Patrzyłem na timeit
moduł, ale wygląda na to, że dotyczy tylko małych fragmentów kodu. Chcę zmierzyć czas całego programu.
round(time.time() - start_time, 2)
(lub cokolwiek chcesz dziesiętnie), odzyskiwałem liczby naukowe jak 1,24e-5.'%.2f'
zamiastround()
tutaj.Umieszczam ten
timing.py
moduł w swoim własnymsite-packages
katalogu i po prostu wstawiamimport timing
u góry mojego modułu:Mogę również dzwonić
timing.log
z poziomu mojego programu, jeśli w programie chcę pokazać znaczące etapy. Ale samo włączenieimport timing
spowoduje wydrukowanie czasu rozpoczęcia i zakończenia oraz ogólnego czasu, który upłynął. (Wybacz mi moją niejasnąsecondsToStr
funkcję, po prostu formatuje zmiennoprzecinkową liczbę sekund do postaci hh: mm: ss.sss.)Uwaga: Wersja powyższego kodu w języku Python 3 można znaleźć tutaj lub tutaj .
źródło
from functools import reduce
u góry i umieść nawiasy wokół każdej instrukcji print. Działa świetnie!W systemie Linux lub Unix:
W systemie Windows zobacz to pytanie StackOverflow: Jak zmierzyć czas wykonania polecenia w wierszu polecenia systemu Windows?
Aby uzyskać bardziej szczegółowe dane wyjściowe,
źródło
secondsToStr()
funkcję.Naprawdę podoba mi się odpowiedź Paula McGuire'a , ale używam Pythona 3. Dla tych, którzy są zainteresowani: oto modyfikacja jego odpowiedzi, która działa z Pythonem 3 na * nix (wyobrażam sobie, pod Windowsem, że
clock()
powinno się go użyćtime()
):Jeśli uznasz to za przydatne, powinieneś nadal głosować na jego odpowiedź zamiast tej, ponieważ wykonał większość pracy;).
źródło
timedelta(seconds=t).total_seconds()
pomocny.time.clock()
zwraca czas procesora, co pozwala nam obliczyć tylko czas wykorzystany przez ten proces (w każdym razie na Uniksie). Dokumentacja mówi „w każdym razie jest to funkcja używana do testowania porównawczego Pythona lub algorytmów czasowych”źródło
Podoba mi się wynik dostarczany przez
datetime
moduł, w którym obiekty delta czasowej pokazują dni, godziny, minuty itp. W razie potrzeby w sposób czytelny dla człowieka.Na przykład:
Przykładowy wynik np
lub
Jak wspomniał JF Sebastian, takie podejście może napotkać pewne trudne przypadki z czasem lokalnym, więc bezpieczniej jest używać:
źródło
timedelta(seconds=time.monotonic()-start)
tutaj (lubtime.time()
jeśli interwał jest duży). Nie odejmuj naiwnych obiektów daty i godziny reprezentujących czas lokalny; czas lokalny nie jest monotonnastart_time = time.monotonic(); end_time = time.monotonic(); timedelta(seconds=end_time - start_time)
. Ufam, że masz rację, ale musisz też ją sformatować, gdy wróciszdatetime.timedelta(0, 0, 76)
. Wygląda też na to, że monotoniczna metoda została dodana tylko w Pythonie 3.str()
aby uczynić go „ludzkim”. Zaktualizuję odpowiedź, dzięki.Możesz użyć profilera cProfile w Pythonie, aby zmierzyć czas procesora, a także ile czasu spędza każda funkcja i ile razy wywoływana jest każda funkcja. Jest to bardzo przydatne, jeśli chcesz poprawić wydajność skryptu, nie wiedząc od czego zacząć. Ta odpowiedź na inne pytanie dotyczące przepełnienia stosu jest całkiem dobra. Zawsze dobrze jest zajrzeć również do dokumentacji .
Oto przykład, jak profilować skrypt za pomocą cProfile z wiersza poleceń:
źródło
X function calls in Y CPU seconds
. Jeśli chcesz uzyskać zegar ścienny, skorzystaj z jednej z pozostałych odpowiedzi tutaj.Jeszcze lepiej dla Linuksa:
time
źródło
zegar()
time.perf_counter ()
time.process_time ()
źródło
Po prostu użyj
timeit
modułu. Działa zarówno z Python 2, jak i Python 3.Zwraca się w ciągu kilku sekund i możesz mieć swój czas wykonania. Jest to proste, ale należy je zapisać w głównej funkcji ww, która rozpoczyna wykonywanie programu. Jeśli chcesz uzyskać czas wykonania, nawet jeśli wystąpi błąd, weź do niego parametr „Start” i oblicz tam:
źródło
finally
częścią?Poniższy fragment drukuje upływający czas w przyjemnym dla człowieka
<HH:MM:SS>
formacie.źródło
źródło
W IPython „timeit” dowolny skrypt:
źródło
Działa
your_module.main()
jednorazowo i drukuje upływający czas za pomocątime.time()
funkcji jako timera.Aby emulować
/usr/bin/time
w Pythonie, zobacz podprocesor Pythona w / usr / bin / time: jak przechwytywać informacje o taktowaniu, ale ignorować wszystkie inne dane wyjściowe? .Aby zmierzyć czas procesora (np. Nie uwzględniaj czasu podczas
time.sleep()
) dla każdej funkcji, możesz użyćprofile
modułu (cProfile
w Pythonie 2):Możesz przejść
-p
dotimeit
powyższego polecenia, jeśli chcesz używać tego samego timeraprofile
, którego używa moduł.Zobacz Jak profilować skrypt w języku Python?
źródło
Podobało mi się również odpowiedź Paula McGuire'a i wymyśliłem formularz menedżera kontekstu, który bardziej odpowiada moim potrzebom.
źródło
Dla osób korzystających z Notatnika Jupyter
W komórce możesz użyć
%%time
magicznego polecenia Jupytera, aby zmierzyć czas wykonania:Wynik
Spowoduje to tylko przechwycenie czasu wykonania określonej komórki. Jeśli chcesz uchwycić czas wykonania całego notesu (tj. Programu), możesz utworzyć nowy notes w tym samym katalogu i w nowym notesie wykonać wszystkie komórki:
Załóżmy, że powyższy notatnik jest nazywany
example_notebook.ipynb
. W nowym notatniku w tym samym katalogu:Wynik
źródło
Istnieje
timeit
moduł, którego można użyć do pomiaru czasu wykonania kodu Python.Ma szczegółową dokumentację i przykłady w dokumentacji Pythona, 26.6. timeit - Mierzy czas wykonania małych fragmentów kodu .
źródło
timeit
w pytaniu. Pytanie brzmi, w jaki sposób można go tutaj użyć (lub czy należy go tutaj użyć i jakie są alternatywy). Oto możliwa odpowiedź .Użyj line_profiler .
line_profiler będzie profilował czas wykonywania poszczególnych linii kodu. Profiler jest zaimplementowany w C przez Cython w celu zmniejszenia narzutu związanego z profilowaniem.
Wyniki będą:
źródło
Użyłem bardzo prostej funkcji do pomiaru czasu wykonania kodu:
I aby go użyć, po prostu wywołaj go przed kodem, aby zmierzyć, aby pobrać czas funkcji, a następnie wywołaj funkcję po kodzie z komentarzami. Czas pojawi się przed komentarzami. Na przykład:
Następnie dane wyjściowe będą wyglądać następująco:
źródło
Miałem ten sam problem w wielu miejscach, więc stworzyłem pakiet wygody
horology
. Możesz go zainstalować,pip install horology
a następnie zrobić to w elegancki sposób:wyświetli:
Lub nawet prościej (jeśli masz jedną funkcję):
wyświetli:
Dba o jednostki i zaokrąglanie. Działa z Pythonem 3.6 lub nowszym.
źródło
main.interval
.To jest odpowiedź Paula McGuire'a, która działa dla mnie. Na wypadek, gdyby ktoś miał problem z uruchomieniem tego.
Zadzwoń
timing.main()
z twojego programu po zaimportowaniu pliku.źródło
Timeit to klasa w Pythonie używana do obliczania czasu wykonywania małych bloków kodu.
Default_timer to metoda w tej klasie, która służy do pomiaru taktowania zegara ściennego, a nie czasu wykonywania procesora. W związku z tym inne wykonywanie procesu może mieć na to wpływ. Jest więc przydatny w przypadku małych bloków kodu.
Przykładowy kod jest następujący:
źródło
timeit
jest lepszą odpowiedzią IMO dla wielu przypadków.Późniejsza odpowiedź, ale używam
timeit
:code_to_test
.number
argument określa liczbę powtórzeń kodu.źródło
Czas wykonania programu w języku Python może być niespójny w zależności od:
Wynika to z tego, że najskuteczniejszym sposobem jest użycie „Porządku wzrostu” i nauka dużej notacji „O” aby zrobić to poprawnie.
W każdym razie możesz spróbować ocenić wydajność dowolnego programu w języku Python w określonych krokach liczenia maszyn na sekundę za pomocą tego prostego algorytmu: dostosuj to do programu, który chcesz ocenić
źródło
Robisz to po prostu w Pythonie. Nie trzeba tego komplikować.
źródło
Podobnie do odpowiedzi z @rogeriopvl dodałem niewielką modyfikację, aby przekonwertować na godziny i minuty, używając tej samej biblioteki dla zadań długo działających.
Przykładowe dane wyjściowe
źródło
Najpierw należy zainstalować humanfriendly pakiet otwierając wiersza poleceń (cmd) jako administrator i wpisz tam -
pip install humanfriendly
Kod:
Wynik:
źródło
Aby użyć zaktualizowanej odpowiedzi metakermita dla Pythona 2.7, będziesz potrzebować pakietu monotonicznego .
Kod wyglądałby następująco:
źródło
Próbowałem i znalazłem różnicę czasu przy użyciu następujących skryptów.
źródło
Jeśli chcesz mierzyć czas w mikrosekundach, możesz użyć następującej wersji, całkowicie opartej na odpowiedziach Paula McGuire'a i Nicojo - jest to kod Python 3. Dodałem też trochę koloru:
log () => funkcja drukująca informacje o taktowaniu.
txt ==> pierwszy argument do zalogowania i jego ciąg do oznaczenia czasu.
atexit ==> moduł Pythona do rejestrowania funkcji, które można wywołać po wyjściu z programu.
źródło