Verwenden von Python Timeit zum Timen Ihres Codes

In 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 von stmt. Angenommen, Sie berechnen die Ausführungszeit für die Erstellung eines NumPy-Arrays. In diesem Fall ist das Importieren von numpy der Einrichtungscode und die eigentliche Erstellung die Anweisung, die zeitlich festgelegt werden soll.
  • Die Parameternummer gibt an, wie oft der stmt ausgeführt wird. Der Standardwert von number 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 bedeutet, dass wir timeit als Hauptmodul ausführen.
  • n ist eine Befehlszeilenoption, die angibt, wie oft der Code ausgeführt werden soll. Dies entspricht dem Zahlenargument im Funktionsaufruf timeit().
  • Sie können die Option -s verwenden, um den Setup-Code zu definieren.
  So erhalten Sie den kostenlosen Testcode für Cox WiFi Hotspot

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 Wiederholungsoption r auf den Standardwert 5 gesetzt. Das bedeutet, dass die Ausführung von stmt für die angegebene Anzahl 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 der join()-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 beginnt 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 Stoppwert angeben, erhalten Sie einen String-Slice, der sich von Start bis Stopp-1 erstreckt. Daher gibt string_1(1:4) ‚yth‘ zurück.

>>> string_1 = 'Python'
>>> string_1(1:4)
'yth'

Wenn Sie den Startwert nicht angeben, wird der standardmäßige Startwert null verwendet, und das Segment beginnt beim Index null und erstreckt sich bis zum Stopp – 1.

Hier ist der Stoppwert 3, also beginnt der Slice bei Index 0 und geht bis Index 2.

>>> string_1(:3)
'Pyt'

Wenn Sie den Stoppindex nicht einbeziehen, sehen Sie, dass der Slice am Startindex (1) beginnt und sich bis zum Ende der Zeichenfolge erstreckt.

  So installieren Sie das BIOS Spectre-Update für Ihren PC

>>> string_1(1:)
'ython'

Wenn Sie sowohl den Start- als auch den Stoppwert ignorieren, wird ein Teil der gesamten Zeichenfolge zurückgegeben.

>>> string_1(::)
'Python'

Lassen Sie uns ein Slice mit dem Schrittwert erstellen. Stellen Sie die Start-, Stopp- und Schrittwerte 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 eingestellt ist, ergibt 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 Stoppwerte und setzen den Schritt wie gezeigt auf -1:

>>> string_1(::-1)
'nohtyP'

Zusammenfassend: 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 die Methode join() auf dem Reverse-Iterator mit der folgenden Syntax aufrufen: .join(reversed(some-string)).

Das folgende Code-Snippet zeigt einige Beispiele, bei denen das Trennzeichen ein Bindestrich bzw. ein Leerzeichen ist.

>>> '-'.join(reversed(string1))
'n-o-h-t-y-P'
>>> ' '.join(reversed(string1))
'n o h t y 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 von „.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 Einrichtungscode. Hier kehren wir den Python-String um. Während die String-Umkehroperation so oft ausgeführt wird, wie durch Zahl angegeben, 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().

  So erstellen Sie ein Masterdokument und fügen Filialdokumente in MS Word 2016 hinzu

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 messen.

Identifizieren wir zunächst 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. Können Sie erraten, was der Setup-Code sein 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=…) verwenden. 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.