Gibt es einen visuellen Profiler für Python? [geschlossen]

99

Ich benutze jetzt cProfile, aber ich finde es mühsam, pstats-Code zu schreiben, nur um die Statistikdaten abzufragen.

Ich suche ein visuelles Tool, das mir zeigt, was mein Python-Code in Bezug auf CPU-Zeit und Speicherzuweisung tut.

Einige Beispiele aus der Java-Welt sind visualvm und JProfiler .

  • Gibt es so etwas?
  • Gibt es eine IDE, die dies tut?
  • Würde dtrace helfen?

Ich kenne KCachegrind für Linux, würde aber etwas bevorzugen, das ich unter Windows / Mac ausführen kann, ohne KDE zu installieren.

Frederik
quelle
5
Wenn ein solches Programm noch nicht existiert, wäre es ein großartiges Open Source-Projekt.
Carl
@cvondrick Ein Programm wie dieses existiert und wurde bereits erwähnt: KCachegrind.
Devin Jeanpierre
1
@ Devin, ja, aber siehe die Frage. :-)
Carl
Kennen Sie diese Technik: stackoverflow.com/questions/375913/… Sie ist nicht visuell, aber auch nicht langweilig und für ihre Effektivität schwer zu übertreffen.
Mike Dunlavey
4
@ KCacheGrind-Liebhaber: Jeder Grund, KDE nicht installieren zu müssen, ist ein guter Grund, KCacheGrind nicht zu verwenden.
Matt Joiner

Antworten:

86

Ein Freund und ich haben einen Python-Profil-Viewer namens SnakeViz geschrieben , der in einem Webbrowser ausgeführt wird. Wenn Sie RunSnakeRun bereits erfolgreich verwenden, fügt SnakeViz möglicherweise nicht so viel Wert hinzu, aber SnakeViz ist viel einfacher zu installieren.

Bearbeiten: SnakeViz unterstützt Python 2 und 3 und funktioniert auf allen wichtigen Systemen.

Jiffyclub
quelle
41

Mir ist nur RunSnakeRun bekannt .

Vor einiger Zeit wurde auch über einen in PyDev (Eclipse) integrierten Profiler gesprochen, aber ich weiß nicht, ob dies jemals das Licht der Welt erblicken wird.

Update: Leider scheint RunSnakeRun nicht mehr gewartet zu werden und Python 3 wird nicht unterstützt.

Nikow
quelle
+1 für RunSnakeRun. Das beste Werkzeug meiner Meinung nach.
Codeape
4
RunSnakeRun ist gut, aber leider funktioniert es derzeit nicht in Python 3. (True für Juni 2014.)
Ram Rachum
@ Ram: Danke für die Info, das ist bedauerlich :-(.
Nikow
1
Ich habe stattdessen Pyinstrument verwendet. Es ist ein anderes Tier, aber es ist nützlich.
Ram Rachum
Ich mag RunSnakeRun, aber ich mag es nicht, wie Anrufer und Anrufer angezeigt werden. RunSnakeRun zeigt die "Gesamt" -Werte für Anrufanzahl, Ortszeit und kumulierte Zeit für jeden Anrufer / Angerufenen an. Sie können also beispielsweise eine Funktion mit einer Gesamtzeit von 5 Sekunden und einen Angerufenen mit einer Gesamtzeit von 100 Sekunden haben. Nicht so intuitiv und nicht so nützlich wie das, was pstats bietet. pstats verwendet Kontextinformationen zu der betreffenden Funktion, um aussagekräftigere Zahlen für die Anrufer- / Angerufene-Statistik anzugeben. Sie kennen keinen anderen Betrachter, der dies leicht sichtbar macht.
Vultaire
14

Ich benutze gprof2dot.py. Das Ergebnis sieht so aus . Ich benutze diese Befehle:

  python -m cProfile -o profile.dat my_program.py
  gprof2dot.py -f pstats profile.dat | dot -Tpng -o profile.png

Sie müssen graphviz und gprof2dot.py installiert haben. Möglicherweise möchten Sie ein Convenience-Shell-Skript .

maxy
quelle
Wenn Sie svg anstelle von png ausgeben (mit dot -Tsvg -o profile.svg), können Sie das Ausgabediagramm mit Ihrem Browser durchsuchen und das Bild ohne Zacken skalieren.
Razeh
8

Spyder bietet auch eine hübsche Benutzeroberfläche für cProfile:

Geben Sie hier die Bildbeschreibung ein

jsexauer
quelle
2
Wie lade ich ein vorhandenes Profil?
Clément
4

Diese Person hat ein grafisches Profil erstellt, das hier beschrieben wird . Vielleicht könnten Sie das als Ausgangspunkt für Ihre eigene Arbeit verwenden.

PaulMcG
quelle
1
Das ist sehr cool, aber anscheinend nur für C / C ++. Es verwendet jedoch Python.
Rory
4

KCacheGrind enthält eine Version namens QCacheGrind, die unter Mac OS X und Windows ausgeführt wird .

Akaihola
quelle
Darüber hinaus scheint OP Abhängigkeiten für KCachegrind unter Linux falsch zu interpretieren. Unter Debian / Ubuntu / Mint benötigen Sie apt-get install kcachegrindlediglich 3 KDE-bezogene Bibliotheken.
Saaj
2
@saaj bei der Installation von Ubuntu 17.04 apt install kcachegrindmöchte 102 Pakete installieren, einschließlich ~ 40 KDE-Bibliotheken.
Mark E. Haase
@mehaase Auf frisch ubuntu:xenialmag es dreimal so viele sein, aber es ist für eine Entwicklungsumgebung und ich sehe es kaum als Problem. Und apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends kcachegrind | grep kde | grep Depends | sort -u | wc -lsagt eigentlich nur 13.
Saaj
2

Python Call Graph generiert Bilder, die denen in Maxys Antwort sehr ähnlich sind . Außerdem wird die Gesamtzeit für jede Funktion angezeigt. Aus irgendeinem Grund wird sie in den Beispieldiagrammen nicht angezeigt.

Lev Levitsky
quelle
1

Ich habe ein browserbasiertes Visualisierungstool geschrieben, profile_eye , das mit der Ausgabe von gprof2dot arbeitet .

gprof2dot eignet sich hervorragend zum Grokken vieler Ausgaben von Profilierungswerkzeugen und leistet hervorragende Arbeit bei der Platzierung von Diagrammelementen. Das endgültige Rendering ist eine statische Grafik, die oft sehr überladen ist.

Mit d3.js können Sie einen Großteil dieser Unordnung beseitigen, indem Sie nicht fokussierte Elemente, QuickInfos und eine Fischaugenverzerrung relativ verblassen lassen .

Zum Vergleich siehe profile_eyes Visualisierung des von gprof2dot verwendeten kanonischen Beispiels . Insbesondere für Python siehe ein cProfile-Ausgabebeispiel .

Ami Tavory
quelle
1

Betrachten Sie Pyflame + Flammengraph

Pyflame: Ein Ptracing-Profiler für Python + Flamegraph

https://github.com/uber/pyflame

Mit pyflame können Sie einen laufenden Python-Prozess verfolgen.

McKelvin
quelle
0

Ich habe benutzt plop verwendet und fand es sehr leicht. Gibt einen schnellen Einblick in die Perf.

Tante
quelle
vprof ist ein ähnliches Tool, das auch den Flammengraphen verwendet, aber auch Speicherprofile erstellen kann. Leider wird nur die kumulierte Zeit angezeigt und nicht die Gesamtzeit, die in einer Funktion verbracht wurde.
Goodmami