Wenn Sie nur die verstrichene Wanduhrzeit zwischen zwei Punkten messen möchten, können Sie Folgendes verwenden time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Dies gibt die Ausführungszeit in Sekunden an.
Eine weitere Option seit 3.3 ist möglicherweise die Verwendung von perf_counter
oder process_time
, abhängig von Ihren Anforderungen. Vor 3.3 wurde die Verwendung empfohlen time.clock
(danke Amber ). Derzeit ist es jedoch veraltet:
Geben Sie unter Unix die aktuelle Prozessorzeit als Gleitkommazahl in Sekunden zurück. Die Genauigkeit und tatsächlich die Definition der Bedeutung von „Prozessorzeit“ hängt von der der gleichnamigen C-Funktion ab.
Unter Windows gibt diese Funktion die seit dem ersten Aufruf dieser Funktion verstrichenen Wanduhrsekunden als Gleitkommazahl zurück, basierend auf der Win32-Funktion QueryPerformanceCounter()
. Die Auflösung ist normalerweise besser als eine Mikrosekunde.
Veraltet seit Version 3.3 : Das Verhalten dieser Funktion hängt von der Plattform ab: Verwenden Sie stattdessen perf_counter()
oderprocess_time()
, abhängig von Ihren Anforderungen, ein genau definiertes Verhalten.
time.clock()
wird eigentlich bevorzugt, da es nicht gestört werden kann, wenn die Systemuhr durcheinander gerät, aber.time()
meistens den gleichen Zweck erfüllt.)print(timedelta(seconds=execution_time))
. Obwohl es eine separate Frage ist.Verwenden Sie
timeit.default_timer
anstelle vontimeit.timeit
. Ersteres bietet automatisch die beste auf Ihrer Plattform und Version von Python verfügbare Uhr:timeit.default_timer wird je nach Betriebssystem time.time () oder time.clock () zugewiesen. Auf Python 3.3+ DEFAULT_TIMER ist time.perf_counter () auf allen Plattformen. Siehe Python - time.clock () vs. time.time () - Genauigkeit?
Siehe auch:
quelle
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
Modul (das zum Zeitpunkt der Antwort nicht vorhanden ist) , das dieselbe Schnittstelle bietet, das sich jedoch manchmal von dentimeit
Modulentscheidungen zur Messung der Zeitleistung unterscheidet.Nur Python 3:
Da time.clock () ab Python 3.3 veraltet ist , sollten Sie das
time.perf_counter()
systemweite Timing oder das prozessweitetime.process_time()
Timing genau so verwenden, wie Sie es früher verwendet habentime.clock()
:Die neue Funktion
process_time
berücksichtigt nicht die im Schlaf verstrichene Zeit.quelle
timeit.default_timer
anstelle vontime.perf_counter
. Ersterer wählt den geeigneten Timer aus, um die für Ihre Plattform und Python-Version eingestellte Zeitleistung zu messen.process_time()
tut nicht enthalten die Zeit während des Schlafes und daher ist es nicht angemessen verstrichene Zeit zu messen.Wenn Sie eine Funktion haben, die Sie zeitlich festlegen möchten,
test.py:
Am einfachsten
timeit
ist es, es über die Befehlszeile aufzurufen:Versuchen Sie nicht, die Geschwindigkeit von Funktionen zu verwenden
time.time
odertime.clock
(naiv) zu vergleichen. Sie können zu irreführenden Ergebnissen führen .PS. Fügen Sie keine print-Anweisungen in eine Funktion ein, die Sie zeitlich festlegen möchten. Andernfalls hängt die gemessene Zeit von der Geschwindigkeit des Terminals ab .
quelle
Es macht Spaß, dies mit einem Kontextmanager zu tun, der sich beim Start eines
with
Blocks automatisch die Startzeit merkt und beim Beenden des Blocks die Endzeit einfriert. Mit ein wenig Trick können Sie mit derselben Kontextmanager-Funktion sogar eine Liste der abgelaufenen verstrichenen Zeit innerhalb des Blocks abrufen.Die Kernbibliothek hat dies nicht (sollte es aber wahrscheinlich). Sobald Sie an Ort und Stelle sind, können Sie Dinge tun wie:
Hier ist der Kontextmanager- Code, der ausreicht, um den Trick auszuführen :
Und ein lauffähiger Demo-Code:
Beachten Sie, dass aufgrund dieser Funktion der Rückgabewert von
elapsed()
beim Blockausgang eingefroren wird und weitere Aufrufe dieselbe Dauer zurückgeben (in diesem Spielzeugbeispiel etwa 6 Sekunden).quelle
Messzeit in Sekunden:
Ausgabe :
quelle
Ich bevorzuge das.
timeit
doc ist viel zu verwirrend.Beachten Sie, dass hier keine Formatierung stattfindet. Ich habe nur
hh:mm:ss
in den Ausdruck geschrieben, damit man sie interpretieren kanntime_elapsed
quelle
Hier ist eine andere Möglichkeit, dies zu tun:
Vergleich mit traditioneller Art:
Installation:
Weitere Informationen finden Sie auf der PyPi-Seite .
quelle
t.tic()
im Code vergraben rüberkomme, liegt es an mir, dass der Entwickler eine mentale Liste darüber führt, wo in der Serie ich dies erwarten sollte. Bauen Sie Nester oder nur mehrere Tictocs auf?ttictoc
. Ich hatte ein ziemliches Durcheinander, aber es sollte jetzt gut sein.Hier sind meine Ergebnisse, nachdem ich hier viele gute Antworten sowie einige andere Artikel durchgesehen habe.
Erstens, wenn Sie zwischen
timeit
und diskutierentime.time
,timeit
hat das zwei Vorteile:timeit
Wählt den besten verfügbaren Timer für Ihr Betriebssystem und Ihre Python-Version aus.timeit
Deaktiviert die Speicherbereinigung. Dies ist jedoch nicht das, was Sie möglicherweise möchten oder nicht möchten.Das Problem ist nun, dass
timeit
es nicht so einfach zu bedienen ist, da es eingerichtet werden muss und die Dinge hässlich werden, wenn Sie eine Reihe von Importen haben. Idealerweise möchten Sie nur einen Dekorateur oder verwendenwith
Block und messen die Zeit. Leider ist hierfür nichts eingebaut, sodass Sie zwei Möglichkeiten haben:Option 1: Verwenden Sie die Timebudget-Bibliothek
Das Zeitbudget ist eine vielseitige und sehr einfache Bibliothek, die Sie nach der Pip-Installation nur in einer Codezeile verwenden können.
Option 2: Verwenden Sie das Codemodul direkt
Ich habe unten ein kleines Utility-Modul erstellt.
Jetzt können Sie jede Funktion zeitlich festlegen, indem Sie einen Dekorateur davor stellen:
Wenn Sie einen Teil des Codes zeitlich festlegen möchten, fügen Sie ihn einfach in den
with
Block ein:Vorteile:
Es gibt mehrere Versionen mit halber Rückseite, daher möchte ich auf einige Highlights hinweisen:
with utils.MeasureBlockTime() as t
und dannt.elapsed
).quelle
Wenn
time.time
Sie die Ausführung messen, erhalten Sie die Gesamtausführungszeit Ihrer Befehle, einschließlich der Laufzeit, die andere Prozesse auf Ihrem Computer verbringen. Es ist die Zeit, die der Benutzer bemerkt, aber es ist nicht gut, wenn Sie verschiedene Codefragmente / Algorithmen / Funktionen / ... vergleichen möchten.Weitere Informationen zu
timeit
:Wenn Sie einen tieferen Einblick in die Profilerstellung erhalten möchten:
Update : Ich habe http://pythonhosted.org/line_profiler/ im letzten Jahr häufig verwendet und finde es sehr hilfreich und empfehle, es anstelle des Pythons-Profilmoduls zu verwenden.
quelle
Hier ist eine winzige Timer-Klasse, die den String "hh: mm: ss" zurückgibt:
Verwendungszweck:
quelle
Die Python-Module cProfile und pstats bieten eine hervorragende Unterstützung für die Messung der in bestimmten Funktionen verstrichenen Zeit, ohne dass Code um die vorhandenen Funktionen hinzugefügt werden muss.
Zum Beispiel, wenn Sie ein Python-Skript timeFunctions.py haben:
Um den Profiler auszuführen und Statistiken für die Datei zu generieren, können Sie einfach Folgendes ausführen:
Dazu wird das cProfile-Modul verwendet, um alle Funktionen in timeFunctions.py zu profilieren und die Statistiken in der Datei timeStats.profile zu sammeln. Beachten Sie, dass wir dem vorhandenen Modul (timeFunctions.py) keinen Code hinzufügen mussten und dies mit jedem Modul möglich ist.
Sobald Sie die Statistikdatei haben, können Sie das pstats-Modul wie folgt ausführen:
Dadurch wird der interaktive Statistikbrowser ausgeführt, der Ihnen viele nützliche Funktionen bietet. Für Ihren speziellen Anwendungsfall können Sie einfach die Statistiken für Ihre Funktion überprüfen. In unserem Beispiel zeigt die Überprüfung der Statistiken für beide Funktionen Folgendes:
Das Dummy-Beispiel macht nicht viel, gibt Ihnen aber eine Vorstellung davon, was getan werden kann. Das Beste an diesem Ansatz ist, dass ich keinen meiner vorhandenen Codes bearbeiten muss, um diese Zahlen zu erhalten und offensichtlich bei der Profilerstellung zu helfen.
quelle
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
Ihrer Information: Wenn Sie Ihre Python-Version überprüfen, die Sie ausführen. Ich habe das bekommen, als ich ranntepython3 -m cProfile...
undpython -m pstats
. Mein Fehler hat mich aber für eine Sekunde erwischt, also wollte ich teilendon't forget consistency
. =)Hier ist ein weiterer Kontextmanager für Timing-Code:
Verwendungszweck:
oder, wenn Sie den Zeitwert benötigen
Benchmark.py :
Angepasst von http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
quelle
Verwenden Sie das Profiler-Modul. Es gibt ein sehr detailliertes Profil.
es gibt so etwas aus wie:
Ich fand es sehr informativ.
quelle
main()
? Wäre nützlicher, wenn Sie ein einfaches Codebeispiel bereitstellen könnten.Ich mag es einfach (Python 3):
Die Ausgabe erfolgt in Mikrosekunden für eine einzelne Ausführung:
Erläuterung : timeit führt die anonyme Funktion standardmäßig 1 Million Mal aus und das Ergebnis wird in Sekunden angegeben . Daher ist das Ergebnis für eine einzelne Ausführung der gleiche Betrag, jedoch im Durchschnitt in Mikrosekunden .
Fügen Sie bei langsamen Vorgängen eine geringere Anzahl von Iterationen hinzu, oder Sie könnten ewig warten:
Die Ausgabe erfolgt immer in Sekunden für die Gesamtzahl der Iterationen:
quelle
(Nur mit Ipython) Sie können % timeit verwenden , um die durchschnittliche Verarbeitungszeit zu messen:
und dann:
Das Ergebnis ist so etwas wie:
quelle
Eine weitere Möglichkeit, timeit zu verwenden :
quelle
auf python3:
elegant und kurz.
quelle
Eine Art super spätere Antwort, aber vielleicht erfüllt sie einen Zweck für jemanden. Dies ist ein Weg, den ich für super sauber halte.
Beachten Sie, dass "print" eine Funktion in Python 3 und nicht in Python 2.7 ist. Es funktioniert jedoch mit jeder anderen Funktion. Prost!
quelle
Sie können timeit verwenden.
Hier ist ein Beispiel zum Testen von naive_func, das Parameter mit Python REPL verwendet:
Sie benötigen keine Wrapper-Funktion, wenn die Funktion keine Parameter hat.
quelle
lambda
wäre prägnanter:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
Wir können Zeit auch in lesbare Zeit umwandeln.
quelle
Ich habe dafür eine Bibliothek erstellt. Wenn Sie eine Funktion messen möchten, können Sie dies einfach so tun
https://github.com/Karlheinzniebuhr/pythonbenchmark
quelle
Gehen Sie folgendermaßen vor, um einen Einblick in alle Funktionsaufrufe zu erhalten:
Es werden nur diese 2 Codezeilen in einem Jupyter-Notizbuch benötigt , und es wird ein schönes interaktives Diagramm erstellt. Zum Beispiel:
Hier ist der Code. Auch hier sind die 2 Zeilen, die mit beginnen,
%
die einzigen zusätzlichen Codezeilen, die für die Verwendung von snakeviz benötigt werden:Es scheint auch möglich zu sein, snakeviz außerhalb von Notebooks auszuführen. Weitere Infos auf der Snakeviz-Website .
quelle
quelle
Dieser einzigartige klassenbasierte Ansatz bietet eine druckbare Zeichenfolgendarstellung, eine anpassbare Rundung und einen bequemen Zugriff auf die verstrichene Zeit als Zeichenfolge oder Float. Es wurde mit Python 3.7 entwickelt.
Verwendungszweck:
quelle
Messen Sie die Ausführungszeit kleiner Codefragmente.
Quell- Python-Dokumente !
quelle
Wenn Sie Funktionen bequem zeitlich festlegen möchten, können Sie einen einfachen Dekorateur verwenden:
Sie können es für eine Funktion verwenden, die Sie wie folgt zeitlich festlegen möchten:
Bei jedem Aufruf
function_to_time
wird dann gedruckt, wie lange es gedauert hat und wie die Funktion zeitgesteuert ist.quelle
basierend auf der Kontextmanager-Lösung von https://stackoverflow.com/a/30024601/5095636 , unter der Lambda-freien Version, warnt flake8 vor der Verwendung von Lambda gemäß E731 :
Prüfung:
quelle
Der einfachste Weg, um die Dauer einer Operation zu berechnen:
quelle
Hier ist ein ziemlich gut dokumentierter und vollständig typisierter Dekorateur, den ich als allgemeines Dienstprogramm verwende:
Anwendungsbeispiel:
Die Doktrinen können überprüft werden mit:
Und der Typ gibt Hinweise mit:
quelle
Callable[[AnyF], AnyF]
. Was bedeutet das?AnyF
verstandenCallable[..., Any]
, soAnyF
ist eine Funktion , die jede Menge jeglicher Art Argumente und Rückkehr etwas dauern kann. SoCallable[[AnyF], AnyF]
würde erweiternCallable[[Callable[..., Any]], Callable[..., Any]]
. Dies ist der Typ des Rückgabewerts vontimer
aka the full type ofdecorator
. Es ist eine Funktion, die jede Art von Funktion als einziges Argument verwendet und jede Art von Funktion zurückgibt.