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 timeit
Modul das einfachste . timeit
wird 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.
timeit
ist 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 timeit
funktioniert:
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,12523150,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 importierenprint (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.