In einem großen Projekt stieß ich auf eine Funktion, die ziemlich langsam ist (gesprochen von Sekunden bis Minuten Ausführungszeit). Die Funktion macht viele Dinge und hat einen sehr tiefen Stacktrace. Obwohl nur wenige Klassen an der Ausführung dieser Funktion beteiligt sind, ist es nicht so offensichtlich, woher die lange Laufzeit kommt.Verfolgen Sie die Ursache für eine langsame Funktion in Python
Ich fing an, die Funktion zu debuggen, Anrufe usw. zu verfolgen und fand das trace Paket ziemlich nützlich. Damit konnte ich einige Funktionen identifizieren, die immer wieder Listen bilden würden, die beim Speichern der Listen nach der ersten Ausführung tatsächlich zu einer Beschleunigung von etwa 3x führen.
Aber jetzt kann ich wirklich keine offensichtlichen Teile mehr sehen, wo die Funktion optimiert werden kann, da das Trace-Paket mehrere Megabyte Text produziert und ich nichts erkennen kann, was mir verdächtig erscheint.
Ich dachte über die Timing-Option der Ablaufverfolgung, um mir einen Überblick über die Laufzeit zu geben, um zu sehen, welche Funktionen langsam sein könnten - aber die Menge der Daten ist einfach zu groß, so dass eine Zusammenfassung wäre schön Die Gesamtausführungszeit jedes Aufrufs wird aufgelistet, aber es scheint, dass dies vom Ablaufverfolgungspaket nicht unterstützt wird.
Noch eine Frage ist, auf welcher Ebene möchte ich die Ausführungszeiten bekommen. Es ist eher nicht der Fall, dass eine einzelne Anweisung langsam ist, aber eine ganze Funktion oft aufgerufen wird oder die Daten nicht gespeichert werden. Also was ich irgendwann brauchen würde ist die durchschnittliche Ausführungszeit pro Anweisung multipliziert mit der Anzahl. Der spätere kann vom Trace-Paket generiert werden.
Gibt es irgendwann noch ein anderes Tool außer pdb und Trace, die ich verwenden könnte?
ohh, ich sollte wirklich gelesen haben, die gesamte Dokumentation von Python. Ich denke, genau das habe ich gesucht! – reox
Gern geschehen. ;-) –