Mit dem timeit-Modul der Python-Standardbibliothek können Sie ganz einfach die Ausführungszeit eines Prozesses in Ihrem Code messen. Dies ist nützlich für eine schnelle Überprüfung.
Die folgenden beiden Fälle werden hier erörtert.
- Maßnahme in einer Python-Datei:
timeit.timeit()
,timeit.repeat()
- Messung mit Jupyter Notebook:
%timeit
,%%timeit
Eine andere Möglichkeit ist die Verwendung von time.time() zur Messung der im Programm verstrichenen Zeit.
Messungen in Python-Dateien: timeit.timeit(), timeit.repeat()
Als Beispiel messen wir die Verarbeitungszeit einer einfachen Funktion, test(n), die die Summe von n aufeinanderfolgenden Zahlen berechnet.
import timeit
def test(n):
return sum(range(n))
n = 10000
loop = 1000
result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842
Wenn Sie den Code, den Sie messen wollen, als String an die Funktion timeit.timeit() übergeben, wird dieser NUMMERNMAL ausgeführt und die dafür benötigte Zeit zurückgegeben.
Der Standardwert für Anzahl ist 1.000.000. Beachten Sie, dass die Verwendung des Standardwerts für einen zeitaufwändigen Prozess sehr viel Zeit in Anspruch nimmt.
Durch die Übergabe von globals() als Argument globals wird der Code im globalen Namespace ausgeführt.
Ohne dies werden die Funktion test und die Variable n im obigen Beispiel nicht erkannt.
Der zu spezifizierende Code kann ein aufrufbares Objekt statt einer Zeichenkette sein, so dass er als Lambda-Ausdruck ohne Argumente angegeben werden kann; in diesem Fall muss das Argument globals nicht angegeben werden.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Die Einheit des Ergebnisses ist Sekunden. Hier ist die Ausgabe die Verarbeitungszeit pro Ausführung geteilt durch die Anzahl der Ausführungen.
Wenn Sie nicht dividieren, wird der Ergebniswert einfach größer, wenn Sie die Anzahl der Ausführungen erhöhen.
print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038
Mit der Funktion timeit.repeat() kann timeit() wiederholt ausgeführt werden. Das Ergebnis wird in Form einer Liste ausgegeben.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Messung mit Jupyter Notebook:%timeit, %%timeit
In Jupyter Notebook (IPython) können Sie die folgenden magischen Befehle verwenden; es ist nicht notwendig, das timeit-Modul zu importieren.
%timeit
%%timeit
%timeit
In %timeit geben Sie den Zielcode durch ein Leerzeichen getrennt an, wie bei Befehlszeilenargumenten.
Standardmäßig werden die Anzahl und die Wiederholung in timeit.timeit() automatisch bestimmt. Sie können sie auch mit den Optionen -n und -r festlegen.
Die Ergebnisse werden als Mittelwert und Standardabweichung berechnet.
%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
%%timeit
Der magische Befehl %%timeit kann verwendet werden, um die Verarbeitungszeit einer ganzen Zelle zu messen.
Führen wir als Beispiel denselben Prozess mit NumPy durch. Die Optionen -n und -r können weggelassen werden.
Da wir die Verarbeitungszeit der gesamten Zelle messen, umfasst das folgende Beispiel auch die Zeit für den Import von NumPy.
%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
Es ist nicht notwendig, den Zielcode als Argument für %%timeit anzugeben. Sie müssen lediglich %%timeit an den Anfang einer Zelle schreiben, daher ist es am einfachsten zu verwenden.