Verwenden von Python Timeit zum Timen Ihres Codes
Veröffentlicht: 2023-01-17In diesem Tutorial erfahren Sie, wie Sie die timeit-Funktion aus dem timeit-Modul von Python verwenden. Sie lernen, wie Sie einfache Ausdrücke und Funktionen in Python timen.
Das Timing Ihres Codes kann Ihnen dabei helfen, eine Schätzung der Ausführungszeit eines Codeabschnitts zu erhalten und auch die Abschnitte des Codes zu identifizieren, die optimiert werden müssen.
Wir beginnen damit, die Syntax der timeit
-Funktion von Python zu lernen. Und dann werden wir Beispiele codieren, um zu verstehen, wie Sie es verwenden können, um Codeblöcke und Funktionen in Ihrem Python-Modul zu timen. Lass uns anfangen.
So verwenden Sie die Python-timeit-Funktion
Das timeit
-Modul ist Teil der Python-Standardbibliothek und Sie können es importieren:
import timeit
Die Syntax zur Verwendung der timeit
Funktion aus dem timeit
-Modul lautet wie folgt:
timeit.timeit(stmt, setup, number)
Hier:
-
stmt
ist das Stück Code, dessen Ausführungszeit gemessen werden soll. Sie können es als einfache Python-Zeichenfolge oder als mehrzeilige Zeichenfolge angeben oder den Namen des aufrufbaren Elements übergeben. - Wie der Name schon sagt, bezeichnet
setup
den Code, der nur einmal ausgeführt werden muss, oft als Voraussetzung für die Ausführung vonstmt
. Angenommen, Sie berechnen die Ausführungszeit für die Erstellung eines NumPy-Arrays. In diesem Fall ist das Importierennumpy
dersetup
und die eigentliche Erstellung die Anweisung, die zeitlich festgelegt werden soll. - Die Parameternummer gibt an, wie oft der
number
stmt
wird. Der Standardwert vonnumber
ist 1 Million (1000000), aber Sie können diesen Parameter auch auf jeden anderen Wert Ihrer Wahl setzen.
Nachdem wir nun die Syntax zur Verwendung der Funktion timeit()
gelernt haben, beginnen wir mit der Codierung einiger Beispiele.
Timing einfacher Python-Ausdrücke
In diesem Abschnitt versuchen wir, die Ausführungszeit einfacher Python-Ausdrücke mit timeit zu messen.
Starten Sie eine Python REPL und führen Sie die folgenden Codebeispiele aus. Hier berechnen wir die Ausführungszeit von Potenzierungs- und Bodenteilungsoperationen für 10000 und 100000 Läufe.
Beachten Sie, dass wir die zu timende Anweisung als Python-String übergeben und ein Semikolon verwenden, um die verschiedenen Ausdrücke in der Anweisung zu trennen.
>>> import timeit >>> timeit.timeit('3**4;3//4',number=10000) 0.0004020999999738706 >>> timeit.timeit('3**4;3//4',number=100000) 0.0013780000000451764
Ausführen von Python timeit in der Befehlszeile
Sie können timeit
auch auf der Kommandozeile verwenden. Hier ist das Befehlszeilenäquivalent des timeit-Funktionsaufrufs:
$ python-m timeit -n [number] -s [setup] [stmt]
-
python -m timeit
, dass wirtimeit
als Hauptmodul ausführen. -
n
ist eine Befehlszeilenoption, die angibt, wie oft der Code ausgeführt werden soll. Dies entspricht dem Zahlenargument im Funktionsaufrufnumber
timeit()
. - Sie können die Option
-s
verwenden, um den Setup-Code zu definieren.
Hier schreiben wir das vorherige Beispiel mit dem Befehlszeilenäquivalent um:
$ python -m timeit -n 100000 '3**4;3//4' 100000 loops, best of 5: 35.8 nsec per loop
In diesem Beispiel berechnen wir die Ausführungszeit der eingebauten Funktion len()
. Die Initialisierung der Zeichenfolge ist der Setup-Code, der mit der Option s
übergeben wird.
$ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)' 100000 loops, best of 5: 239 nsec per loop
Beachten Sie in der Ausgabe, dass wir die Ausführungszeit für Best-of-5 -Läufe erhalten. Was bedeutet das? Wenn Sie timeit
in der Befehlszeile ausführen, wird die repeat
r
auf den Standardwert 5 gesetzt. Das bedeutet, dass die Ausführung von stmt
für die angegebene number
von Malen fünfmal wiederholt wird und die beste der Ausführungszeiten zurückgegeben wird.
Analyse von String-Umkehrmethoden mit timeit
Wenn Sie mit Python-Strings arbeiten, möchten Sie diese möglicherweise umkehren. Die beiden gängigsten Ansätze zur Umkehrung von Zeichenfolgen sind wie folgt:
- Verwenden von String-Slicing
- Verwenden der
reversed()
Funktion und derjoin()
Methode
Umgekehrte Python-Strings mit String Slicing
Sehen wir uns an, wie String Slicing funktioniert und wie Sie damit einen Python-String umkehren können. Bei Verwendung der Syntax some-string[start:stop]
wird ein Teil der Zeichenfolge zurückgegeben, der am Index start
und sich bis zum Index stop-1
erstreckt. Nehmen wir ein Beispiel.
Betrachten Sie die folgende Zeichenfolge „Python“. Der String hat die Länge 6 und die Liste der Indizes ist 0, 1, 2 bis 5.
>>> string_1 = 'Python'
Wenn Sie sowohl den start
als auch den stop
angeben, erhalten Sie einen String-Slice, der sich von start
bis stop-1
erstreckt. Daher gibt string_1[1:4]
'yth' zurück.
>>> string_1 = 'Python' >>> string_1[1:4] 'yth'
Wenn Sie den start
nicht angeben, wird der standardmäßige start
null verwendet, und das Slice beginnt beim Index null und erstreckt sich bis zum stop - 1
.
Hier ist der stop
3, also beginnt der Slice bei Index 0 und geht bis Index 2.
>>> string_1[:3] 'Pyt'
Wenn Sie den stop
nicht einbeziehen, sehen Sie, dass der Slice am start
(1) beginnt und sich bis zum Ende der Zeichenfolge erstreckt.
>>> string_1[1:] 'ython'
Wenn Sie sowohl den start
als auch den stop
ignorieren, wird ein Teil der gesamten Zeichenfolge zurückgegeben.
>>> string_1[::] 'Python'
Lassen Sie uns ein Slice mit dem step
erstellen. Stellen Sie die start
, stop
und step
auf 1, 5 bzw. 2 ein. Wir erhalten einen Teil der Zeichenfolge, der bei 1 beginnt und sich bis 4 erstreckt (mit Ausnahme des Endpunkts 5), der jedes zweite Zeichen enthält.
>>> string_1[1:5:2] 'yh'
Wenn Sie einen negativen Schritt verwenden, können Sie einen Slice beginnend am Ende der Zeichenfolge erhalten. Wenn der Schritt auf -2 gesetzt ist, string_1[5:2:-2]
das folgende Slice:
>>> string_1[5:2:-2] 'nh'
Um also eine umgekehrte Kopie der Zeichenfolge zu erhalten, überspringen wir die start
und stop
und setzen den Schritt wie gezeigt auf -1:
>>> string_1[::-1] 'nohtyP'
Zusammengefasst:
string[::-1]
gibt eine umgekehrte Kopie des Strings zurück.
Umkehren von Zeichenfolgen mit integrierten Funktionen und Zeichenfolgenmethoden
Die eingebaute Funktion reversed()
in Python gibt einen umgekehrten Iterator über die Elemente der Zeichenfolge zurück.
>>> string_1 = 'Python' >>> reversed(string_1) <reversed object at 0x00BEAF70>
Sie können also den umgekehrten Iterator mit einer for-Schleife durchlaufen:
for char in reversed(string_1): print(char)
Greifen Sie in umgekehrter Reihenfolge auf die Elemente der Zeichenfolge zu.
# Output n o h t y P
Als Nächstes können Sie dann die Methode join()
auf dem umgekehrten Iterator mit der folgenden Syntax aufrufen: <sep>.join(reversed(some-string))
.
Das folgende Code-Snippet zeigt einige Beispiele, bei denen das Trennzeichen ein Bindestrich bzw. ein Leerzeichen ist.
>>> '-'.join(reversed(string1)) 'nohtyP' >>> ' '.join(reversed(string1)) 'nohty P'
Hier wollen wir kein Trennzeichen; Setzen Sie also das Trennzeichen auf eine leere Zeichenfolge, um eine umgekehrte Kopie der Zeichenfolge zu erhalten:
>>> ''.join(reversed(string1)) 'nohtyP'
Die Verwendung
''.join(reversed(some-string))
gibt eine umgekehrte Kopie der Zeichenfolge zurück.
Ausführungszeiten vergleichen mit timeit
Bisher haben wir zwei Ansätze kennengelernt, um Python-Strings umzukehren. Aber wer von ihnen ist schneller? Lass es uns herausfinden.
In einem vorherigen Beispiel, in dem wir einfache Python-Ausdrücke getaktet haben, hatten wir keinen setup
. Hier kehren wir den Python-String um. Während die String-Umkehroperation so oft ausgeführt wird, wie es durch number
angegeben ist, ist der setup
-Code die Initialisierung des Strings, der nur einmal ausgeführt wird.
>>> import timeit >>> timeit.timeit(stmt = 'string_1[::-1]', setup = "string_1 = 'Python'", number = 100000) 0.04951830000001678 >>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000) 0.12858760000000302
Bei der gleichen Anzahl von Durchläufen zum Umkehren der gegebenen Zeichenfolge ist der Ansatz zum Schneiden von Zeichenfolgen schneller als die Verwendung der Methode join()
und der Funktion reversed()
.
Timing von Python-Funktionen mit timeit
In diesem Abschnitt erfahren Sie, wie Sie Python-Funktionen mit der Funktion timeit timen. Bei einer gegebenen Liste von Strings gibt die folgende Funktion hasDigit
die Liste der Strings zurück, die mindestens eine Ziffer haben.
def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit
Nun möchten wir die Ausführungszeit dieser Python-Funktion hasDigit()
mit timeit
.
Identifizieren wir zuerst die zeitgesteuerte Anweisung ( stmt
). Es ist der Aufruf der Funktion hasDigit()
mit einer Liste von Strings als Argument. Als nächstes definieren wir den Setup -Code. Kannst du erraten, wie der setup
-Code lauten sollte?
Damit der Funktionsaufruf erfolgreich ausgeführt wird, sollte der Einrichtungscode Folgendes enthalten:
- Die Definition der Funktion
hasDigit()
- Die Initialisierung der Argumentliste von Zeichenfolgen
Lassen Sie uns den Setup-Code in der setup
-Zeichenfolge definieren, wie unten gezeigt:
setup = """ def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit thislist=['puffin3','7frost','blue'] """
Als nächstes können wir die Funktion timeit
verwenden und die Ausführungszeit der Funktion hasDigit()
für 100000 Läufe erhalten.
import timeit timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
# Output 0.2810094920000097
Fazit
Sie haben gelernt, wie Sie die Timeit-Funktion von Python verwenden, um Ausdrücke, Funktionen und andere aufrufbare Elemente zu timen. Dies kann Ihnen helfen, Ihren Code zu bewerten, die Ausführungszeiten verschiedener Implementierungen derselben Funktion zu vergleichen und vieles mehr.
Sehen wir uns an, was wir in diesem Tutorial gelernt haben. Sie können die Funktion timeit()
mit der Syntax timeit.timeit(stmt=...,setup=...,number=...)
. Alternativ können Sie timeit in der Befehlszeile ausführen, um kurze Codeschnipsel zu timen.
Als nächsten Schritt können Sie untersuchen, wie Sie andere Python-Profilerstellungspakete wie line-profiler und memprofiler verwenden, um Ihren Code für Zeit bzw. Speicher zu profilieren.
Als Nächstes erfahren Sie, wie Sie den Zeitunterschied in Python berechnen.