Mit cProfile Ergebnisse mit KCacheGrind
-
19-09-2019 - |
Frage
Ich verwende cProfile mein Python-Programm zu profilieren. Basierend auf dieses Gespräch Ich hatte den Eindruck, dass KCacheGrind könnte die Ausgabe von cProfile analysieren und anzuzeigen.
Allerdings, wenn ich gehen, um die Datei zu importieren, KCacheGrind nur zeigt ein ‚Unbekanntes Dateiformat‘ Fehler in der Statusleiste und setzt sich dort nichts angezeigt wird.
Gibt es etwas Besonderes ich tun muss, bevor mein Profil Statistiken mit KCacheGrind kompatibel sind?
...
if profile:
import cProfile
profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'
profile = cProfile.Profile()
profile.run('pilImage = camera.render(scene, samplePattern)')
profile.dump_stats(profileFileName)
profile.print_stats()
else:
pilImage = camera.render(scene, samplePattern)
...
Paketversionen
- KCacheGrind 4.3.1
- Python 2.6.2
Lösung 3
Es kann mit einem externen Modul lscallproftree
genannt erfolgenIn diesem Artikel wird erklärt, wie: CherryPy - cachegrind
Mit meinem resultierenden Code aussehen wie so:
...
if profile:
import cProfile
import lsprofcalltree
profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'
profile = cProfile.Profile()
profile.run('pilImage = camera.render(scene, samplePattern)')
kProfile = lsprofcalltree.KCacheGrind(profile)
kFile = open (profileFileName, 'w+')
kProfile.output(kFile)
kFile.close()
profile.print_stats()
else:
pilImage = camera.render(scene, samplePattern)
...
Wenn jemand einen Weg kennt, dies zu tun, die keine externes erfordern (dh. Nicht mit Python ausgeliefert) -Modul, würde ich immer noch sehr interessiert sein, davon zu hören.
Andere Tipps
Mit cProfile können Sie auch bestehende Programme profilieren, ohne gesonderte Profilierung Skript zu machen. Führen Sie einfach Programm mit Profiler
python -m cProfile -o profile_data.pyprof script_to_profile.py
und offene Profildaten in kcachegrind mit pyprof2calltree, deren -k Schalter öffnet automatisch Daten in kcachegrind
pyprof2calltree -i profile_data.pyprof -k
Zum Beispiel Profilierungs ganzen Paster-Servers und Webapp würde wie dieses
erfolgenpython -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltree kann mit easy_install installiert werden.
könnten Sie verwenden profilestats.profile
Dekorateur ($ pip install profilestats
) - ein einfaches Wrapper für pyprof2calltree Modul (Rebranding von lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
Script kann wie gewohnt ausgeführt werden soll. profilestats
erstellt zwei Dateien. cachegrind.out.profilestats
und profilestats.prof
in KCachegrind-kompatibel und cProfile formatiert entsprechend
Wenn das, was Sie tatsächlich versuchen zu tun, ist zu sehen, welche Teile des Codes auf Geschwindigkeit optimiert werden können, und Sie können es zufällig in dem Debugger anhalten, diese Methode funktioniert . Es mag überraschen, aber Sie brauchen nicht sehr viele stackshots.
3 Möglichkeiten differents Ihren Code und Visualisierung von Ergebnissen in KCachegrind / Qcachegrind zum Profil:
I - Cprofile
1 - Profil myfunc () von ipython
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2 - Konvertieren Sie Ihre Datei in eine verwendbaren kcachegrind Datei in Ihrem Shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Offene callgrind.filename.prof in kcachegrind
II - Eingebettete Cprofile
. 1 - Profil paar Zeilen im Code
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)
2 - Konvertieren Sie Ihre Datei in eine verwendbaren kcachegrind Datei in Ihrem Shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Offene callgrind.filename.prof in kcachegrind
III - Yappi
1 - Profil myfunc () von ipython oder aus dem Code
import yappi
filename = 'callgrind.filename.prof'
yappi.set_clock_type('cpu')
yappi.start(builtins=True)
myfunc()
stats = yappi.get_func_stats()
stats.save(filename, type='callgrind')
2 - Offene callgrind.filename.prof in kcachegrind