Wie kann man profile ein Python-script?
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?
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.
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 -
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.
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 -
time
Befehl, und es wird Ihnen sagen, wie lange etwas gedauert hat.InformationsquelleAutor 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
Auch via YouTube.
Leider, aber Sie können nicht Sortieren percall für entweder die Summe oder die kumulative Zeit, die ist ein großer Mangel, IMO.
Es ist auch erwähnenswert, dass können Sie das Modul cProfile von ipython mit der magic-Funktion %prun (Profil ausführen). Zuerst importieren Sie Ihr Modul an, und rufen Sie dann die main-Funktion mit %prun: import euler048; %prun euler048.main()
Für die Visualisierung von cProfile dumps (erstellt von
python -m cProfile -o <out.profile> <script>
), RunSnakeRun, aufgerufenrunsnake <out.profile>
ist von unschätzbarem Wert.auch für python 3,
cprofile
ist noch zu empfehlen überprofile
.InformationsquelleAutor Chris Lawlor
Vor einer Weile machte ich
pycallgraph
erzeugt eine Visualisierung von Ihrem Python-code. Edit: ich habe aktualisiert das Beispiel funktioniert mit 3.3, die neueste Version, als dies geschrieben.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:Sie können die Farben anpassen, wie du willst, und das sogar unabhängig für jede Messung. Zum Beispiel rot für Anrufe, blau für die Uhrzeit, grün für die Speichernutzung.
immer diese Fehlermeldung
Traceback (most recent call last): /pycallgraph.py", line 90, in generate output.done() File "/net_downloaded/pycallgraph-develop/pycallgraph/output/graphviz.py", line 94, in done source = self.generate() File "/net_downloaded/pycallgraph-develop/pycallgraph/output/graphviz.py", line 143, in generate indent_join.join(self.generate_attributes()), File "/net_downloaded/pycallgraph-develop/pycallgraph/output/graphviz.py", line 169, in generate_attributes section, self.attrs_from_dict(attrs), ValueError: zero length field name in format
Ich aktualisiert dieses zu erwähnen, dass Sie müssen installieren Sie GraphViz für Dinge zu arbeiten, wie beschrieben. Unter Ubuntu ist dies nur
sudo apt-get install graphviz
.Dies erfordert ein bisschen Arbeit zu installieren ist hier in 3 Schritten zu helfen. 1. Die Installation über pip, 2. Installieren Sie GraphViz über exe, 3. Einrichten der path-Variablen zu GraphViz-Verzeichnis 4. Herauszufinden, wie zu reparieren alle anderen Fehler. 5. Herauszufinden, wo es speichert die png-Datei?
InformationsquelleAutor gak
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.Es ist nicht in der Dokumentation, aber es ist in das Modul. Siehe hg.python.org/cpython/file/6bf07db23445/Lib/cProfile.py#l140. Das ermöglicht das Profil eine bestimmte Funktion aufrufen und in unserem Fall wollen wir das Profil der Thread
target
- Funktion, die ist, was diethreading.Thread.run()
Aufruf ausgeführt wird. Aber wie ich schon sagte in der Antwort, ist es wahrscheinlich nicht Wert, es zu Unterklasse Thread, da jeder third-party-code nicht es verwenden, und verwenden Sie stattdessenthreading.setprofile()
.die Verpackung der code mit profiler.aktivieren() und profiler.disable () - scheint ganz gut zu funktionieren, auch. Das ist im Grunde das, was runcall tun und es nicht durchsetzen beliebige Anzahl von Argumenten oder ähnliche Dinge.
Ich kombinierte meine eigene stackoverflow.com/questions/10748118/... mit ddaa.net/blog/python/lsprof-calltree und es kindof Werke ;!-)
Joe, weißt du, wie die profiler spielt mit asyncio in Python 3.4?
InformationsquelleAutor 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 :
graphviz ist auch erforderlich, wenn Sie mit OSX
Auf meinem Ubuntu 14.04 installation
sudo apt-get install gprof2dot
Ergebnisse in einerE: Unable to locate package gprof2dot
Fehler. Aber wenn ichsudo pip install gprof2dot
es funktioniert gut. Sind Sie sicher, dass Sie gemeintapt-get
und nichtpip install
?Ich habe die edit-PS: vielleicht möchten Sie sich in python-virtualenv, oder conda, wenn Sie mit der anaconda distribution von python. Halten Sie es so, dass Sie nicht zu verschmutzen, die Sie machen, python-Website-Pakete mit dem Paket, das Sie herunterladen, für ein einzelnes Projekt.
Sie sind Recht
pip install
nichtapt-get install
, ich habe es oben.InformationsquelleAutor 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:
pwd
/gprof2dot/gprof2dot.py $HOME/bin (oder verwenden ln -s $PWD/gprof2dot/gprof2dot.py ~/bin in den meisten shells - grave-Akzent genommen, wie die Formatierung in der ersten version).Ah, guter Punkt. Ich bekomme
ln
's argument-Reihenfolge falsch fast jedes mal.der trick ist, sich daran zu erinnern, dass ln und cp haben das gleiche argument, um - denken, es als 'das kopieren von Datei1 in Datei2 oder dir2, aber ein link"
Das macht Sinn, ich denke die Verwendung von "TARGET" in der manpage wirft mir.
ln -s " an 😉
InformationsquelleAutor 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 zaxliu
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:
brew install qcachegrind
und substitude jederkcachegrind
mitqcachegrind
in der Beschreibung für eine erfolgreiche Profilierung.Das ist cool! Vielen Dank für diese. Definitiv eine gute Visualisierung für
cProfile.
InformationsquelleAutor Federico
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 Pete
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 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 BenC
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. Sehr einfach.
InformationsquelleAutor CodeCabbie
Habe ich vor kurzem erstellt Thunfisch für die Visualisierung von Python-Laufzeitumgebung und import von Profilen; dies kann hier hilfreich sein.
Installieren mit
Erstellen Sie eine runtime-Profil
oder ein import-Profil (Python 3.7+ erforderlich)
Dann einfach laufen Thunfisch auf die Datei
InformationsquelleAutor Nico Schlömer
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.cprofile.py
's-source-code zeigt, dass die genau, wasruncall()
tut. Mehr bestimmte, nach der Erstellung eines Profils Beispiel mitprof = cprofile.Profile()
, rufen Sie sofortprof.disable()
, und fügen Sie einfachprof.enable()
undprof.disable()
fordert, um den Abschnitt von code, den Sie möchten, profiliert.Dies ist sehr hilfreich, aber es scheint der code, der tatsächlich zwischen aktivieren und deaktivieren ist nicht profiliert - nur die Funktionen, die es fordert. Habe ich dieses Recht? Ich würde einwickeln, diesen code in eine Funktion aufrufen, für ihn zählen die zahlen in print_stats().
InformationsquelleAutor PypeBros
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 David Mašek
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 Walter
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 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.Leider ist der obige code funktioniert nur mit der version 0.62 ist nicht verfügbar auf pypy. Modul kompiliert werden muss von 0.62 Quellen finden Sie hier: github.com/nirs/yappi/releases oder erstellen verwenden, die ich für windows in repo-Gabel für diesen Zweck github.com/Girgitt/yappi/releases
InformationsquelleAutor Mr. Girgitt
https://github.com/amoffat/Inspect-Shell
Könnten Sie (und Ihre Armbanduhr).
InformationsquelleAutor 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 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 Fabio Zadrozny
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 VishalMishra
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 z0r
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 Vincent Fenet