Bevor Sie Python-Code optimieren, bestimmen Sie die Aufgabe, die zu langsam ist. Halten Sie Eingaben, erwartete Ausgabe und den Ablauf fest. Ein Profil hilft anschließend zu erkennen, welche Funktionen oder Zeilen zur Laufzeit beitragen.
Eine Funktion untersuchen
Das Beispiel summiert einen Zahlenbereich. Es eignet sich zum Kennenlernen des zeilenweisen Profils, belegt jedoch keine Leistung einer Anwendung. Für diesen Block muss line_profiler in Ihrer Entwicklungsumgebung installiert sein.
# Beispiel für das Profiling mit line_profiler
from line_profiler import LineProfiler
def test_function():
summe = 0
for i in range(100000):
summe += i
return summe
lp = LineProfiler()
lp_wrapper = lp(test_function)
lp_wrapper()
lp.print_stats()
Eine Alternative mit demselben Ergebnis vergleichen
Eine mögliche Alternative verwendet die eingebaute Funktion sum(). Der Kommentar beschreibt die Alternative; eine Beschleunigung muss mit der eigenen Umgebung gemessen werden.
# Alternative mit derselben fachlichen Ausgabe
def optimierte_test_function():
return sum(range(100000))
Prüfen Sie zuerst, ob beide Funktionen dasselbe Ergebnis liefern. Vergleichen Sie danach die Laufzeit mit passenden Eingaben und mehreren Messungen. Der Aufwand des Profilers selbst gehört nicht mit einem normalen Lauf gleichgesetzt.
Den Engpass in der Anwendung prüfen
Eine langsame Funktion kann Rechenzeit verbrauchen, auf die Datenbank warten oder unnötig oft aufgerufen werden. Diese Ursachen verlangen unterschiedliche Änderungen. Berücksichtigen Sie auch Speicherverbrauch und Lesbarkeit, wenn Sie eine Alternative auswählen.
Übertragen Sie einen Befund aus einer kurzen Zahlenschleife nicht auf sämtliche Abläufe. Messen Sie nach der Änderung den ursprünglichen fachlichen Vorgang erneut. Dokumentieren Sie das Ergebnis einschließlich der verwendeten Daten und Umgebung. Zusätzliche Kompilierungsschritte sind erst dann sinnvoll zu prüfen, wenn der gemessene Engpass sie rechtfertigt.
Weiterführende Dokumentation: Python: Profiling.
Weiterführende Dokumentation: line_profiler.