Ich habe cProfile verwendet, um meinen Code zu profilieren, und es hat großartig funktioniert. Ich benutze auch gprof2dot.py , um die Ergebnisse zu visualisieren (macht es etwas klarer).
CProfile (und die meisten anderen Python-Profiler, die ich bisher gesehen habe) scheinen jedoch nur auf der Ebene des Funktionsaufrufs zu profilieren. Dies führt zu Verwirrung, wenn bestimmte Funktionen von verschiedenen Orten aus aufgerufen werden. Ich habe keine Ahnung, ob Anruf Nr. 1 oder Anruf Nr. 2 die meiste Zeit in Anspruch nimmt. Dies wird noch schlimmer, wenn die betreffende Funktion sechs Ebenen tief ist und von sieben anderen Stellen aus aufgerufen wird.
Wie erhalte ich eine zeilenweise Profilerstellung?
An Stelle von:
function #12, total time: 2.0s
Ich würde gerne so etwas sehen:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile zeigt zwar an, wie viel der Gesamtzeit an das übergeordnete Element "übertragen" wird, aber diese Verbindung geht wieder verloren, wenn Sie mehrere Ebenen und miteinander verbundene Anrufe haben.
Im Idealfall hätte ich gerne eine grafische Benutzeroberfläche, die die Daten analysiert und mir dann meine Quelldatei mit einer Gesamtzeit für jede Zeile anzeigt. Etwas wie das:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Dann könnte ich auf den zweiten "func (c)" - Anruf klicken, um zu sehen, was in diesem Anruf Zeit in Anspruch nimmt, getrennt vom "func (a)" - Anruf.
Ist das sinnvoll? Gibt es eine Profilbibliothek, die diese Art von Informationen sammelt? Gibt es ein großartiges Tool, das ich vermisst habe?
pstats.print_callers
. Ein Beispiel ist hier .