Utilizzando i risultati Cprofile con KCachegrind
-
19-09-2019 - |
Domanda
sto usando Cprofile al profilo il mio programma Python. Sulla base di questo discorso ho avuto l'impressione che KCachegrind in grado di analizzare e visualizzare l'output da Cprofile.
Tuttavia, quando vado a importare il file, KCachegrind appena viene visualizzato un errore 'Unknown File Format' nella barra di stato e si siede lì la visualizzazione di nulla.
C'è qualcosa di speciale che ho bisogno di fare prima le mie statistiche di profiling sono compatibili con KCachegrind?
...
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)
...
Versioni Package
- KCachegrind 4.3.1
- Python 2.6.2
Soluzione 3
Si può essere fatto utilizzando un modulo esterno chiamato lscallproftree
In questo articolo viene spiegato come: CherryPy - Cachegrind
Con il mio codice risultante cercando in questo modo:
...
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)
...
Se qualcuno conosce un modo per fare ciò che non necessita di un esterno (es. Non fornito con Python) modulo, sarei ancora molto interessato a sentire su di esso.
Altri suggerimenti
Con Cprofile è possibile anche il profilo dei programmi esistenti, senza fare qualsiasi script di profili separati. Basta eseguire il programma con il profiler
python -m cProfile -o profile_data.pyprof script_to_profile.py
e profili aperti dati in kcachegrind con pyprof2calltree, il cui interruttore -k apre automaticamente i dati in kcachegrind
pyprof2calltree -i profile_data.pyprof -k
Per esempio profilatura intero server paster e webapp sarebbe fatto come questo
python -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltree può essere installato con easy_install.
Si potrebbe utilizzare profilestats.profile
decoratore ($ pip install profilestats
) - un semplice wrapper per pyprof2calltree modulo (rebranding di lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
Script può essere eseguito come di consueto. profilestats
crea due file:. cachegrind.out.profilestats
e profilestats.prof
in KCachegrind-compatibile e Cprofile formati corrispondentemente
Se state realmente cercando di fare è vedere quali parti del codice potrebbero essere ottimizzate per la velocità, e si può mettere in pausa in modo casuale nel debugger, questo metodo funziona . Può essere sorprendente, ma non c'è bisogno molti stackshots.
3 differenti modi nel proprio profilo codice e risultati visualizzando in KCachegrind / Qcachegrind:
I - Cprofile
1 - Profilo myfunc () da ipython
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2 - Convertire il file in un file kcachegrind utilizzabile nella shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Aprire callgrind.filename.prof in kcachegrind
II - EMBEDDED Cprofile
1 -. Profilo poche righe nel codice
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)
2 - Convertire il file in un file kcachegrind utilizzabile nella shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Aprire callgrind.filename.prof in kcachegrind
III - YAPPI
1 - Profilo myfunc () dal ipython o dal codice
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 - Aprire callgrind.filename.prof in kcachegrind