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?
quelle
pstats.print_callers
. Ein Beispiel ist hier .Antworten:
Ich glaube, dafür ist Robert Kerns line_profiler gedacht. Über den Link:
Hoffentlich hilft das!
quelle
import line_profiler;
und dann ?Sie können auch pprofile ( pypi ) verwenden. Wenn Sie die gesamte Ausführung profilieren möchten, ist keine Änderung des Quellcodes erforderlich. Sie können eine Teilmenge eines größeren Programms auch auf zwei Arten profilieren:
Schalten Sie die Profilerstellung um, wenn Sie einen bestimmten Punkt im Code erreichen, z.
Umschalten der Profilerstellung asynchron vom Aufrufstapel (erfordert eine Möglichkeit, diesen Code in einer betrachteten Anwendung auszulösen, z. B. einem Signalhandler oder einem verfügbaren Worker-Thread) mithilfe der statistischen Profilerstellung:
Das Ausgabeformat für Code-Annotationen ähnelt dem Zeilenprofiler:
Beachten Sie, dass pprofile, da es nicht auf Codeänderungen angewiesen ist, Modulanweisungen der obersten Ebene profilieren kann, wodurch die Programmstartzeit profiliert werden kann (wie lange es dauert, Module zu importieren, globale Elemente zu initialisieren, ...).
Es kann eine Cachegrind-formatierte Ausgabe generieren, sodass Sie kcachegrind verwenden können, um große Ergebnisse einfach zu durchsuchen.
Offenlegung: Ich bin ein Profilautor.
quelle
Sie können Hilfe nehmen line_profiler für dieses Paket
1. Installieren Sie zuerst das Paket:
2. Laden Sie das Paket mit dem Befehl magic in Ihre Python- / Notebook-Umgebung
3. Wenn Sie die Codes für eine Funktion profilieren möchten,
gehen Sie wie folgt vor:
Sie erhalten eine schöne formatierte Ausgabe mit allen Details, wenn Sie diese Schritte ausführen :)
quelle
Nur um die oben erwähnte Antwort von @Joe Kington zu verbessern .
Verwenden Sie für Python 3.x line_profiler :
Installation:
Verwendung:
Angenommen, Sie haben das Programm
main.py
und darin Funktionenfun_a()
undfun_b()
möchten sich zeitlich profilieren. Sie müssen den Dekorator@profile
direkt vor den Funktionsdefinitionen verwenden. Zum BeispielDas Programm kann durch Ausführen des Shell-Befehls profiliert werden:
Die Argumente können mit abgerufen werden
$ kernprof -h
Die Ergebnisse werden auf der Konsole wie folgt gedruckt:
BEARBEITEN: Die Ergebnisse der Profiler können mit dem TAMPPA- Paket analysiert werden . Mit ihm können wir zeilenweise gewünschte Diagramme erhalten als
quelle
PyVmMonitor verfügt über eine Live-Ansicht, die Ihnen dort weiterhelfen kann (Sie können eine Verbindung zu einem laufenden Programm herstellen und Statistiken daraus abrufen).
Siehe: http://www.pyvmmonitor.com/
quelle