HOWTO · Python

Timer-Funktionen in Python

Dieses Tutorial zeigt, wie Sie die Laufzeit eines Python-Codes überwachen und analysieren

Auf dieser Seite

Verwenden Sie time.perf_counter() für die meisten Messungen verstrichener Zeit. Wenn Sie gezielt die vom aktuellen Prozess verbrauchte CPU-Zeit ermitteln möchten, wählen Sie time.process_time(). Das Modul time bietet außerdem time.time() für Zeitstempel der Systemuhr und time.monotonic() für Zeitintervalle, die nicht durch Änderungen der Systemuhr beeinflusst werden sollen. Halten Sie für jede Messung zuerst den Startwert fest, führen Sie dann die Arbeit aus und erfassen Sie anschließend den Endwert. Ziehen Sie den Startwert vom Endwert ab. Die folgenden Ausschnitte dienen der Veranschaulichung; die gemessenen Zeiten hängen vom Rechner und vom jeweiligen Durchlauf ab.

Wanduhrzeit mit time.time() messen

time.time() gibt die aktuelle Zeit der Systemuhr in Sekunden seit der Unix-Epoche zurück: dem 1. Januar 1970 um 00:00:00 UTC. Verwenden Sie die Funktion, wenn Sie einen Zeitstempel speichern, anzeigen oder mit einem anderen Zeitstempel vergleichen möchten. Da sie der Systemuhr folgt, können Änderungen durch das Betriebssystem oder den Benutzer den Messwert beeinflussen. Für kurze Zeitintervalle ist sie deshalb keine gute Standardwahl: Eine Uhrenkorrektur zwischen den beiden Messungen kann die Differenz verfälschen.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import time

start = time.time()
total = sum(range(1, 1001))
end = time.time()

print(f"sum={total}")
print(f"elapsed={end - start:.6f} seconds")

Die erste Zeile gibt die deterministische Summe aus; die zweite zeigt eine gemessene Dauer, die variieren kann. Der zu messende Code sollte zwischen den beiden Messungen liegen, damit die Differenz genau die gewünschte Arbeit abbildet.

CPU-Zeit mit time.process_time() messen

time.process_time() misst die CPU-Zeit, die der aktuelle Prozess verbraucht. Der Wert schließt die Zeit aus, die beim Schlafen oder Warten auf Eingaben, eine Netzwerkantwort oder einen anderen Prozess vergeht. Verwenden Sie die Funktion, um abzuschätzen, wie viel Prozessorzeit Ihr Code beansprucht, und nicht, wie lange ein Benutzer auf das Ergebnis wartet. Wenn Sie den Startwert vom Endwert abziehen, erhalten Sie die CPU-Dauer der dazwischen ausgeführten Arbeit.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import time

start = time.process_time()
total = sum(number * number for number in range(100_000))
cpu_seconds = time.process_time() - start
print(f"sum={total}; CPU time={cpu_seconds:.6f} seconds")

Wenn eine Aufgabe häufig warten muss, kann ihre CPU-Dauer deutlich kürzer als die verstrichene Zeit sein. Dieser Unterschied ist hilfreich, um Rechenarbeit von Wartezeit abzugrenzen. Für sich allein zeigt er jedoch nicht, worauf der Prozess gewartet hat.

Verstrichene Zeit mit time.perf_counter() messen

time.perf_counter() ist eine hochauflösende monotone Uhr, die für die Messung verstrichener Zeitintervalle vorgesehen ist. Ihr Ausgangspunkt ist nicht festgelegt. Verwenden Sie daher die Differenz zwischen zwei Messwerten, statt einen einzelnen Wert als Datum oder Zeitstempel zu deuten. Anders als die CPU-Zeit eines Prozesses schließt die verstrichene Zeit auch Schlaf- und Wartezeiten ein. Die Funktion eignet sich sowohl für kurze Funktionen als auch für längere Vorgänge; ihre Genauigkeit ist kein Grund, sie auf kleine Prozesse zu beschränken.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import time

start = time.perf_counter()
time.sleep(0.1)
elapsed = time.perf_counter() - start
print(f"elapsed={elapsed:.3f} seconds")

Das Ergebnis liegt ungefähr bei der angeforderten Schlafdauer; durch die Prozessplanung und die Systemauslastung kann zusätzliche Zeit hinzukommen. Wiederholen Sie für Benchmarks vergleichbare Arbeit und vergleichen Sie Messungen unter ähnlichen Bedingungen, statt einen einzelnen Messwert als garantiertes Ergebnis zu betrachten.

Verstrichene Zeit mit time.monotonic() messen

time.monotonic() misst ebenfalls verstrichene Zeitintervalle. Die Uhr kann durch Änderungen der Systemuhr nicht zurückgestellt werden. Ihr Bezugspunkt ist nicht definiert, daher sind nur Differenzen zwischen Messwerten aussagekräftig. Verwenden Sie die Funktion für Zeitlimits oder Prüfungen verstrichener Zeit, wenn Änderungen der Wanduhr die Berechnung nicht beeinflussen sollen. Ihre Messwerte passen sich nicht an externe Uhrenänderungen an; bei der Intervallmessung bleiben diese Änderungen vielmehr ohne Einfluss.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import time

start = time.monotonic()
time.sleep(0.1)
elapsed = time.monotonic() - start
print(f"elapsed={elapsed:.3f} seconds")

Wählen Sie time.time(), wenn Sie einen Unix-Zeitstempel benötigen, time.process_time() für die vom Prozess verbrauchte CPU-Zeit und time.perf_counter() für allgemeine Messungen verstrichener Zeit. Verwenden Sie time.monotonic(), wenn ein Intervall oder Zeitlimit auch bei Änderungen der Systemuhr zuverlässig bleiben muss. In jedem Fall bestimmt der Code zwischen den beiden Messungen, welche Arbeit die gemessene Dauer umfasst.