Verwendung von timeit zum Profilieren von Python-Code

Python stellt Komfort, Lesbarkeit und Benutzerfreundlichkeit vor Leistung. Das heißt aber nicht, dass Sie sich mit langsamem Python-Code zufrieden geben sollten. Es gibt wahrscheinlich etwas, das Sie tun können, um es zu beschleunigen.

Unter den verfügbaren Tools zum Profilieren der Leistung von Python-Code ist das timeitModul das einfachste . timeitwird verwendet, um die Geschwindigkeit kleiner Codeausschnitte - einige Zeilen, eine Funktion - zu messen, indem der Code tausende oder sogar millionenfach ausgeführt und angegeben wird, wie lange diese Ausführungen gedauert haben.

timeitist am nützlichsten, um zwei oder drei verschiedene Arten zu vergleichen und zu sehen, welche die schnellste ist. Beispielsweise ist eine Schleife, die für Tausende von Iterationen ausgeführt wird, ein häufiger Python-Engpass. Wenn Sie einen Weg finden, die Implementierung dieser Schleife zu beschleunigen - beispielsweise durch die Verwendung von Python-integrierten Funktionen anstelle von handgeschriebenem Code -, können Sie eine messbare Leistungsverbesserung erzielen.

Ein einfaches Beispiel für Python-Timeit

Hier ist ein einfaches Beispiel, wie es timeitfunktioniert:

def f1 (): für n im Bereich (100): pass def f2 (): n = 0, während n <100: n + = 1, wenn __name__ == "__main__": timeit print importieren (timeit.timeit (f1, number =) 100000)) print (timeit.timeit (f2, number = 100000)) 

Dieses Programm vergleicht die Leistung von zwei Möglichkeiten, eine Schleife 100 Mal zu durchlaufen: mithilfe der in Python integrierten  range Funktion ( f1) und durch Inkrementieren einer Variablen ( f2). timeit führt jeden dieser Ansätze 100.000 Mal aus und bietet am Ende jeweils eine Gesamtlaufzeit. timeit Verwendet standardmäßig  eine Million Läufe. Dieses Beispiel zeigt jedoch, wie Sie die Anzahl der Läufe auf eine beliebige Zahl einstellen können, die angemessen erscheint.

Die Ergebnisse (von einem Intel i7-3770K Prozessor):

0,1252315

0,45453989999999994

Offensichtlich ist der  range Ansatz mit einem Faktor von etwa 3,75 viel schneller. Das ist nicht überraschend. Die Verwendung eines integrierten Python bietet normalerweise eine bessere Leistung als die manuelle Bearbeitung von Python-Objekten.

Verwenden Sie Python timeit, indem Sie eine Zeichenfolge übergeben

Eine andere Möglichkeit  timeit besteht darin, eine Zeichenfolge zu übergeben, die als Python-Programm ausgewertet wird:

Zeit importieren

print (timeit.timeit ('für n im Bereich (100): pass'))

Dies kann auch über die Befehlszeile erfolgen:

python -m timeit "für n im Bereich (100): pass"

Im Großen und Ganzen ist es jedoch einfacher, die oben gezeigte Technik zu verwenden, da Sie Ihren Code nicht umständlich in eine Textzeichenfolge einbinden müssen.

Python Timeit Tipps

Beachten Sie, so nützlich es auch  timeit ist, diese Einschränkungen bei der Verwendung.

Vermeiden Sie die Verwendung von timeit für die Erstellung von Profilen für das gesamte Programm

Nichts sagt, dass man mit  einem ganzen Programm keine Zeit  messen  kanntimeit . Ein einfaches 10-zeiliges Skript ist beispielsweise kein schlechter Kandidat für ein solches Profil.

Es gibt jedoch bessere Tools für diesen Job - zum Beispiel das Python-  cProfile Modul, das weitaus detailliertere Statistiken über die Leistung Ihres gesamten Programms generiert. timeit funktioniert am besten mit einer einzelnen Komponente oder einem Code-Snippet - wieder einer Funktion oder einigen Codezeilen. Alles andere führt normalerweise zu Ergebnissen, die zu verrauscht und inkonsistent sind, um aussagekräftige Leistungsinformationen zu erhalten.

Wenn das von Ihnen erstellte Programm viele Minuten dauert, ist  timeit es nicht sehr nützlich. Zum einen wird es zu lange dauern, bis der Code mehr als ein paar Mal ausgeführt wird, sodass die ermittelten Timings sehr grob sind. Für zwei sind andere Werkzeuge besser für den Job geeignet.

Führen Sie mehrere Zeitläufe auf verschiedenen Computern durch

Programme laufen nicht jedes Mal mit der gleichen Geschwindigkeit. Moderne Computerumgebungen bringen eine Menge Unsicherheit mit sich - Wettbewerb mit anderen Programmen um Ressourcen, Cache-Verhalten, Zeitplanung und so weiter. timeit versucht dies durch Ausführen des Codes ad infinitum zu kompensieren, aber es ist immer noch eine gute Idee, mehrere Versuche zusammenzufassen. Sie sollten ein timeit Profil viele Male erstellen, die schlechtesten und besten Ergebnisse erzielen  und den Rest mitteln.

Schließlich ist es auch hilfreich, denselben Test auf verschiedenen Systemen auszuführen: Wie verhält sich etwas Festplattengebundenes auf einer SSD im Vergleich zu einer herkömmlichen rotierenden Festplatte? Wie bei jeder anderen Frage zur Leistung - raten Sie nicht, testen Sie.