2010-12-28 11 views
21

Ich benutzte einen netten Apple Profiler, der in der System Monitor Anwendung eingebaut ist. Solange Ihr C++ - Code mit Debug-Informationen kompiliert wurde, könnten Sie Ihre laufende Anwendung testen und es würde eine eingerückte Struktur ausgeben, die Ihnen sagt, wie viel Prozent der Zeit der übergeordneten Funktion in dieser Funktion verbraucht wurde (und der Body vs. andere Funktionsaufrufe) .Wie können Sie den Aufrufbaum mit Python Profiler erhalten?

Zum Beispiel, wenn Haupt genannt function_1 und function_2, function_2 Anrufe function_3 und dann Haupt Anrufe function_3:

main (100%, 1% in function body): 
    function_1 (9%, 9% in function body): 
    function_2 (90%, 85% in function body): 
     function_3 (100%, 100% in function body) 
    function_3 (1%, 1% in function body) 

Ich würde das sehen und denken: „Etwas ist im Code eine lange Zeit in der Körper von function_2. Wenn ich möchte, dass mein Programm schneller ist, dann sollte ich anfangen. "

Weiß jemand, wie ich am einfachsten diese genaue Profiling-Ausgabe für ein Python-Programm bekommen kann?

Ich habe Leute sagen gesehen, dies zu tun:

import cProfile, pstats 
prof = cProfile.Profile() 
prof = prof.runctx("real_main(argv)", globals(), locals()) 
stats = pstats.Stats(prof) 
stats.sort_stats("time") # Or cumulative 
stats.print_stats(80) # 80 = how many to print 

aber es ist ziemlich chaotisch im Vergleich zu diesem eleganten Aufrufbaum. Bitte lassen Sie mich wissen, wenn Sie dies leicht tun können, würde es ziemlich helfen.

Prost!

Antwort

9

Überprüfen Sie diese Bibliothek http://pycallgraph.slowchop.com/ für Call-Graphen. Es funktioniert wirklich gut. Wenn Sie bestimmte Funktionen profilieren möchten, überprüfen Sie http://mg.pov.lt/blog/profiling.html

Dies ist ein Ergebnis aus dem Profilehooks-Modul.

alt text

+0

Wissen Sie, ob dieses Paket Zeit sowie die Anzahl der Funktionsaufrufe verstrichen tun kann? Zum Beispiel hätte ich nichts dagegen, __hash __() tausende Male aufzurufen, aber das wiederholte Aufrufen von sorted() auf großen Listen könnte ziemlich langsam sein. – user

+0

Sie sollten beide einfach ausprobieren. Grundsätzlich machen sie das Gleiche auf unterschiedliche Weise mit unterschiedlichen Leistungen. – Falmarri

+0

+1, das Paket ist im Einklang mit dem, was ich im Sinn hatte und war schnell und einfach zu installieren und anzurufen. Macht es Ihnen etwas aus, mir zu sagen, wie Sie die obige Zahl bekommen haben? Ich machte einen Graphen (mit pycallgraph.start_trace() und pycallgraph.make_dot_graph ('test.jpg', format = 'jpg', tool = 'neato') ), aber es ist viel zu voll und viele Funktionen sind verdeckt. – user

15

Ich wollte vor kurzem die gleichen, nahm so einen Stich an einem selbst umzusetzen.

Das Projekt ist auf Github. https://github.com/joerick/pyinstrument

Hier ist, wie Sie es verwenden würde:

from pyinstrument import Profiler 

profiler = Profiler() 
profiler.start() 

# code you want to profile 

profiler.stop() 

print(profiler.output_text()) 
+1

Das ist fantastisch, danke! – Maximilian

+0

Es scheint nett, hier ist eine, die mehr eine generische Bibliothek ist: https://github.com/vmprof/vmprof-python – dashesy

+1

Das ist wirklich cool, danke! – Dakkaron

38

Ich stolperte auf diese als gut, und verbrachte einige Zeit zu lernen, wie ein Aufrufgraphen zu erzeugen (die normalen Ergebnisse cProfile ist nicht sehr informativ). Zukünftige Referenz, hier ist eine andere Möglichkeit, eine schöne Call-Tree-Grafik mit cProfile + gprof2dot + graphViz zu generieren.

-------

  1. GraphViz Install: http://www.graphviz.org/Download_macos.php
  2. easy_install gprof2dot
  3. Run-Profil auf dem Code.

    python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ... 
    
  4. Run gprof2dot den Anruf Profil in eine Punktdatei

    gprof2dot -f pstats myLog.profile -o callingGraph.dot 
    
  5. Öffnen mit graphviz konvertieren die grafische Darstellung würde

Hier ist, was das Endergebnis aussehen sichtbar zu machen! Grafik ist farbcodiert - Rot bedeutet höhere Zeitkonzentration.

Graph is color-coded- red means higher concentration of time

+4

[xdot] (https://pypi.python.org/pypi/xdot) ist ein netter interaktiver Viewer für .dot-Dateien, mit dem Sie Dinge zoomen können. –

+2

Kann die .dot-Datei unter Unix mit einem Shell-Befehl wie "dot callingGraph.dot -Tpng | display" anstelle von Schritt 5 anzeigen. – benjimin

+1

Große Antwort, genau das, was ich gesucht habe, danke! –

Verwandte Themen