Wie kann ich Python-Code Zeile für Zeile profilieren?
Habe ich mit cProfile zu Profil meine code, und es funktioniert bestens. Ich benutze auch gprof2dot.py zur Visualisierung der Ergebnisse (macht es ein wenig klarer).
Jedoch, cProfile (und die meisten anderen python-Profiler, die ich bisher gesehen habe), scheinen nur Profil auf der function-call-Ebene. Dies führt zu Verwirrung, wenn bestimmte Funktionen aufgerufen werden, von verschiedenen stellen - ich habe keine Ahnung, ob call #1 oder call #2 nimmt die Mehrheit der Zeit. Dies wird noch schlimmer, wenn die Funktion in Frage 6 Ebenen tief, der von 7 anderen stellen.
Also meine Frage ist: wie bekomme ich eine line-by-line-profiling? Stattdessen:
function #12, total time: 2.0s
Ich würde gerne etwas wie dieses:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile nicht zeigen, wie viel von der gesamten Zeit, die "transfers" an die Eltern, aber auch in diesem Zusammenhang geht verloren, wenn Sie eine Reihe von Ebenen und miteinander telefonieren.
Ideal, ich würde gerne eine GUI haben, würde analysieren, durch die Daten, dann zeigen Sie mir meine Quelldatei mit einer Gesamtzeit angegeben, um jede Zeile. So etwas wie dieses:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Dann würde ich in der Lage, klicken Sie auf die zweite "func(c)" nennen, um zu sehen, was unter, auf Zeit, call, getrennt von der "func ()" aufrufen.
Macht das Sinn? Gibt es eine profiling-Bibliothek, sammelt diese Art von info? Gibt es ein paar tolle Tools, die ich verpasst habe? Jedes feedback wird sehr geschätzt. Danke!!
pstats.print_callers
. Ein Beispiel ist hier. InformationsquelleAutor der Frage rocketmonkeys | 2010-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass das, was Robert Kern line_profiler vorgesehen ist. Aus dem link:
Hoffe, das hilft!
InformationsquelleAutor der Antwort Joe Kington
Könnten Sie auch pprofile(pypi).
Wenn Sie möchten, um ein Profil der gesamten Ausführung, es erfordert keine Quellcode-änderung.
Sie können auch das Profil einer Teilmenge eines größeren Programms zwei Möglichkeiten:
toggle-profiling, wenn Sie erreichen einen bestimmten Punkt im code, wie zum Beispiel:
Umschalten profiling asynchron von call-stack (benötigt einen Weg, um auslösen Sie diesen code in als Anwendung, zum Beispiel ein signal-handler oder einen verfügbaren Arbeits-thread) mit der statistischen profiling:
Code Anmerkungen output-format ist ähnlich wie die line-profiler:
Beachten Sie, dass, weil pprofile sich nicht auf code-änderungen kann es Profil top-level-module-Anweisungen, so dass das Profil-Programm startup-Zeit (wie lange es braucht, um import-Module initialisieren Sie Globale Variablen, ...).
Generieren cachegrind-formatierte Ausgabe, so dass Sie verwenden können, kcachegrind zu suchen in großen Ergebnisse leicht.
Offenlegung: ich bin pprofile-Autor.
InformationsquelleAutor der Antwort vpelletier
PyVmMonitor hat einen live-view, die helfen können Sie es (Sie können eine Verbindung zu einem ausgeführten Programm und Statistiken).
Finden Sie unter: http://www.pyvmmonitor.com/
InformationsquelleAutor der Antwort Fabio Zadrozny