Wie können Sie ein Skript profilieren?
Projekt Euler und andere coding-Wettbewerbe haben oft eine maximale Laufzeit oder Menschen rühmen, wie schnell Ihre Lösung läuft. Mit python, manchmal sind die Ansätze sind etwas kludgey - D. H., das hinzufügen von timing-code zu __main__
.
Was ist ein guter Weg, um ein Profil, wie lange ein python-Programm ausführen?
Kommentar zu dem Problem
Projekt euler-Programme nicht benötigen, sollten profiling. Entweder du hast einen Algorithmus, der in weniger als einer minute, oder Sie haben völlig den falschen Algorithmus. "Tuning" ist selten angebracht. Sie haben in der Regel zu einem offeneren Ansatz.
S. Lott: Profiling ist oft ein hilfreiches Mittel, um zu bestimmen, welche Unterprogramme sind langsam. Unterprogramme, die eine lange Zeit dauern, sind große Kandidaten für die Algorithmische Verbesserung.
@stalepretzel, Dave: ich schrieb diesen Kommentar Jahren. Ich stehe korrigiert, und habe da beantwortet ein paar meiner eigenen Fragen :). Allerdings habe ich immer noch das Gefühl, cProfile ist nicht so toll. runsnakerun und pycallgraph sind für mich einfacher zu bedienen.
Wenn Sie wissen wollen, wie lange etwas dauert, für den Zweck des Wettbewerbs, dann sollten Sie nicht fügen Sie alle profiling-code, da wird es langsam nach unten. Verwenden Sie einfach die unix
Zeit
- Befehl, und es wird Ihnen sagen, wie lange etwas gedauert hat. InformationsquelleAutor der Frage Chris Lawlor | 2009-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python enthält einen profiler genannt cProfile. Es gibt nicht nur die Laufzeit, sondern auch mal jede Funktion separat, und sagt Ihnen, wie oft jede Funktion aufgerufen wurde, so dass es leicht zu bestimmen, wo Sie sollten machen Optimierungen.
Rufen Sie es in Ihrem code, oder den interpreter, wie diese:
Sogar sinnvoller, Sie rufen die cProfile, wenn ein Skript ausgeführt wird:
Machen es noch einfacher, ich machte eine kleine batch-Datei namens " profile.bat':
Also alles, was ich tun müssen, ist laufen:
Und ich bekomme diese:
EDIT: Aktualisierter link zu einem guten video-Ressource von der PyCon 2013 mit dem Titel
Python-Profiling .
InformationsquelleAutor der Antwort Chris Lawlor
Vor einer Weile machte ich
pycallgraph
erzeugt eine Visualisierung von Ihrem Python-code. Edit: ich habe aktualisiert das Beispiel funktioniert mit der neuesten Version.Nach einem
pip install pycallgraph
und installieren GraphViz Sie können es von der Befehlszeile aus:Oder, können Sie ein Profil bestimmte Teile des Codes:
Entweder von diesen, generieren eine
pycallgraph.png
- Datei ähnlich wie das Bild unten:InformationsquelleAutor der Antwort Gerald Kaszuba
Es ist darauf hinzuweisen, dass mit dem profiler funktioniert nur (standardmäßig) auf der main-thread, und Sie erhalten keine Informationen aus anderen threads, wenn Sie Sie verwenden. Dies kann ein bisschen ein Manko, da es komplett unerwähnt in der profiler-Dokumentation.
Wenn Sie wollen auch, um ein Profil der threads, Sie werden wollen, schauen Sie sich die
threading.setprofile()
- Funktion in der Dokumentation.Könnten Sie auch Ihre eigenen erstellen
threading.Thread
Unterklasse, es zu tun:verwenden und diese
ProfiledThread
Klasse, anstatt der standard. Es könnte Ihnen mehr Flexibilität, aber ich bin mir nicht sicher, es lohnt sich, vor allem, wenn Sie Verwendung von Drittanbieter-code, die würden nicht mit Ihrer Klasse.InformationsquelleAutor der Antwort Joe Shaw
Python-wiki ist eine tolle Seite für profiling-Ressourcen:
http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
da ist der python-Dokumentation:
http://docs.python.org/library/profile.html
wie dargestellt von Chris Lawlor cProfile ist ein großes Werkzeug und kann leicht verwendet werden, um Druck auf den Bildschirm:
oder Datei:
PS> Wenn Sie Ubuntu, stellen Sie sicher, dass Sie python-Profil
Wenn Sie Ausgabe in Datei Sie können erhalten schöne Visualisierungen mithilfe der folgenden tools
PyCallGraph : ein tool zum erstellen von call-graph-Bilder
installieren:
run:
anzeigen:
Können Sie verwenden, was Sie, wie anzeigen der png-Datei, die ich benutzt gimp
Leider bekomme ich oft
dot: graph zu groß für cairo-renderer-bitmaps. Skalierung von 0.257079 passen
das macht meine Bilder unusably klein. Also ich Regel erstellen, die svg-Dateien:
PS> stellen Sie sicher, installieren Sie graphviz (das die dot-Programm):
Alternative Grafische Darstellung mit gprof2dot via @maxy /@quodlibetor :
InformationsquelleAutor der Antwort brent.payne
@Maxy Kommentar diese Antwort mir geholfen, genug, dass ich denke, es verdient eine eigene Antwort: ich hatte schon cProfile-generiert .pstats-Dateien und ich wollte nicht wieder Dinge laufen mit pycallgraph, so habe ich gprof2dot, und bekam ziemlich svgs:
und BLAM!
Es nutzt die dot (die gleiche Sache, die pycallgraph) verwendet, damit die Ausgabe sieht ähnlich aus. Ich habe den Eindruck, dass gprof2dot verliert weniger Informationen, obwohl:
InformationsquelleAutor der Antwort quodlibetor
Rannte ich in ein praktisches tool namens SnakeViz bei den Recherchen zu diesem Thema. SnakeViz ist eine web-basierte profiling-Visualisierungs-tool. Es ist sehr einfach zu installieren und zu verwenden. Die übliche Art, wie ich es zu generieren, eine stat-Datei mit
%prun
und führen Sie dann die Analyse in SnakeViz.Den Haupt-viz Technik verwendet, ist Sunburst-Diagramm wie unten dargestellt, in dem die Hierarchie der Funktionsaufrufe ist angeordnet wie die Schichten von Bögen und Zeit info-codiert in Ihrem eckigen breiten.
Das beste ist, Sie können die Interaktion mit dem Diagramm. Zum Beispiel, um zu vergrößern kann man auf auf einem Bogen, und der Bogen und seine Nachkommen erweitert werden, als neue sunburst, um weitere details anzuzeigen.
InformationsquelleAutor der Antwort zaxliu
Erwähnenswert ist auch die GUI cProfile dump viewer RunSnakeRun. Es ermöglicht Ihnen, zu Sortieren und auszuwählen, dabei Zoom auf die relevanten Teile des Programms. Die Größe der Rechtecke im Bild ist proportional zu der Zeit genommen. Wenn Sie mit der Maus über ein Rechteck, es hervorgehoben, dass der Aufruf in der Tabelle und überall auf der Karte. Wenn Sie doppelklicken Sie auf ein Rechteck, es zoomt auf den Teil. Es wird dir zeigen, wer fordert, dass Teil ist und was das Teil nennt.
Den deskriptiven Informationen, ist sehr hilfreich. Es zeigt Ihnen den code für das bit, das kann hilfreich sein, wenn man es mit built-in library-Aufrufe. Es sagt Ihnen welche Datei und welche Zeile finden Sie den code.
Wollen auch zeigen, dass der OP sagte 'profiling', aber es scheint, er hat gemeint 'timing'. Beachten Programme laufen langsamer, wenn profilierte.
InformationsquelleAutor der Antwort Pete
Ich denke, dass
cProfile
ist ideal für die Profilerstellung, währendkcachegrind
ist ideal für die Visualisierung der Ergebnisse. Diepyprof2calltree
zwischen Griffen die Datei-Konvertierung.Zur Installation der erforderlichen tools (Ubuntu zumindest):
Das Ergebnis:
InformationsquelleAutor der Antwort Federico
Einen schönen profiling-Modul ist die line_profiler (Aufruf über das Skript kernprof.py). Es kann heruntergeladen werden hier.
Mein Verständnis ist, dass cProfile gibt nur Informationen über die gesamte Zeit verbrachte, in jeder Funktion. So dass die einzelnen code-Zeilen sind nicht zeitbegrenzt. Dies ist ein Problem im wissenschaftlichen rechnen, da oft nur eine einzige Zeile kann viel Zeit in Anspruch nehmen. Auch, wie ich mich erinnere, cProfile nicht fangen zu der Zeit verbrachte ich in sagen numpy.dot.
InformationsquelleAutor der Antwort Ian Langmore
pprofile
line_profiler
(bereits hier vorgestellt) auch inspiriert- pprofile
, die beschrieben wird als:Es verfügt über line-Granularität als
line_profiler
ist reines Python, verwendet werden kann als standalone-Befehl oder ein Modul, und kann sogar zu generieren callgrind-format-Dateien können leicht analysiert werden mit[k|q]cachegrind
.vprof
Gibt es auch vprof, ein Python-Paket beschrieben als:
InformationsquelleAutor der Antwort BenC
Folgenden Joe Shaw die Antwort von multi-threaded code nicht wie erwartet funktioniert, dachte ich, dass die
runcall
Methode in cProfile ist bloß tunself.enable()
undself.disable()
Anrufe rund um die profilierte Funktionsaufruf, so können Sie einfach selbst erledigen und haben, was code, den Sie möchten, in-zwischen mit minimaler Interferenz mit den bestehenden code.InformationsquelleAutor der Antwort PypeBros
In Virtaal ist Quelle es ist eine sehr nützliche Klasse und Lackierer, die machen können, profiling (auch für spezifische Methoden/Funktionen) sehr einfach. Die Ausgabe kann dann eingesehen werden, die sehr bequem in KCacheGrind.
InformationsquelleAutor der Antwort Walter
Gibt es eine Menge tolle Antworten, aber Sie entweder Befehlszeile oder irgendein externes Programm zur Profilerstellung und/oder Sortierung der Ergebnisse.
Ich wirklich vermisst gewisser Weise könnte ich in meiner IDE (eclipse-PyDev) ohne Berührung der Befehlszeile oder etwas zu installieren. So ist es hier.
Profiling ohne command line
Sehen docs oder andere Antworten für mehr info.
InformationsquelleAutor der Antwort David Mašek
Einfachste und Schnellste Weg zu finden, wo alle Zeit ist zu gehen.
Zeichnet ein Kreisdiagramm in einem browser. Größte Stück ist das problem der Funktion. Einfach.
InformationsquelleAutor der Antwort CodeCabbie
cProfile ist ideal für schnelle Profilerstellung, aber die meisten der Zeit, es war Ende für mich mit dem Fehler. Funktion runctx löst dieses problem durch die Initialisierung richtig die Umgebung und Variablen, hoffe, es kann nützlich sein für jemanden:
InformationsquelleAutor der Antwort Datageek
Mein Weg ist yappi (https://code.google.com/p/yappi/). Es ist besonders nützlich in Kombination mit einem RPC-server, wo (auch nur zum Debuggen) Sie registrieren-Methode zum starten, beenden und drucken profiling-Informationen, z.B. in dieser Art:
Dann, wenn dein Programm funktioniert, können Sie beginnen profiler jederzeit durch aufrufen der
startProfiler
RPC-Methode und dump-profiling-Informationen in die log-Datei durch den AufrufprintProfiler
(oder ändern Sie die rpc-Methode an den Aufrufer zurückgeben), und bekommen Sie eine solche Ausgabe:Kann es nicht sehr nützlich für kurze Skripte, sondern hilft bei der Optimierung von server-Typ-Verfahren vor allem angesichts der
printProfiler
Methode aufgerufen werden kann mehrere Male im Laufe der Zeit an Profil und vergleichen Sie z.B. unterschiedliche Programm-Nutzungs-Szenarien.InformationsquelleAutor der Antwort Mr. Girgitt
https://github.com/amoffat/Inspect-Shell
Könnten Sie (und Ihre Armbanduhr).
InformationsquelleAutor der Antwort Colonel Panic
Um add-on zu https://stackoverflow.com/a/582337/1070617,
Schrieb ich dieses Modul können Sie verwenden, cProfile, und beobachten Sie die Ausgabe einfach. Mehr hier: https://github.com/ymichael/cprofilev
Siehe auch: http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html auf, wie sinnvoll die gesammelten Statistiken.
InformationsquelleAutor der Antwort michael
Einem neuen Werkzeug um die Profilerstellung in Python ist PyVmMonitor: http://www.pyvmmonitor.com/
Es hat einige einzigartige features wie
Hinweis: es ist kommerziell, aber kostenlos für open source.
InformationsquelleAutor der Antwort Fabio Zadrozny
Es ist auch ein statistischer profiler genannt
statprof
. Es ist ein sampling-profiler, also es fügt nur einen minimalen Aufwand, um Ihren code und gibt line-basiert (nicht nur die Funktion-basierte) timings. Es ist mehr geeignet, um weiche Echtzeit-Anwendungen wie Spiele, aber möglicherweise weniger präzise als cProfile.Den version im pypi ist ein bisschen alt, so kann es installieren, mit
pip
durch die Angabe das git-repository:Können Sie es wie diese:
Siehe auch https://stackoverflow.com/a/10333592/320036
InformationsquelleAutor der Antwort z0r
Es würde davon abhängen, was Sie sehen wollen, aus der Profilerstellung. Einfach mal
Metriken können gegeben sein durch (bash).
Sogar '/usr/bin/time " kann die Ausgabe mit detaillierten Daten durch die mit der '--verbose' flag.
Überprüfen, Zeit-Metrik gegeben, indem Sie jede Funktion und besser zu verstehen, wie viel Zeit damit verbracht wird, auf Funktionen, die Sie verwenden können, die eingebaute cProfile in python.
Gehen in mehr detaillierte Kennzahlen wie Leistung, Zeit ist nicht die einzige Metrik. Sie können sorgen über Speicher, threads, etc.
Profiling-Optionen:
1. line_profiler ist ein weiterer profiler Häufig verwendet, um herauszufinden, timing Metriken line-by-line.
2. memory_profiler ist ein Werkzeug, um ein Profil der Speichernutzung.
3. heapy (aus Projekt Guppy) Profil, wie die Objekte im heap verwendet werden.
Diese sind einige der häufigsten diejenigen, die ich neigen dazu, zu verwenden. Aber wenn Sie mehr erfahren wollen, dann Lesen Sie dieses buchen
Es ist ein ziemlich gutes Buch über beginnend mit Leistung im Verstand. Können Sie sich auf weiterführende Themen auf Cython mit und JIT(Just-in-time) kompiliert python.
InformationsquelleAutor der Antwort VishalMishra
Wenn ich nicht als root auf dem server, ich verwende
lsprofcalltree.py und mein Programm wie diesem:
Dann kann ich den Bericht öffnen mit jedem callgrind-kompatible software, wie qcachegrind
InformationsquelleAutor der Antwort Vincent Fenet