Utilisation des résultats du cProfile avec KCacheGrind
j'utilise cProfile pour profiler mon programme Python. Basé sur cette conversation j'étais sous l'impression que KCacheGrind pourrait Parser et afficher la sortie de cProfile.
cependant, quand je vais importer le fichier, KCacheGrind affiche juste une erreur de "format de fichier inconnu" dans la barre d'état et s'assoit là en n'affichant rien.
y a-t-il quelque chose de spécial que je dois faire avant que mes statistiques de profilage ne soient compatibles avec 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)
...
Les Versions De Package
- KCacheGrind 4.3.1
- Python 2.6.2
5 réponses
avec cProfile vous pouvez également profiler des programmes existants, sans faire de script de profilage séparé. Il suffit de lancer le programme avec profiler
python -m cProfile -o profile_data.pyprof script_to_profile.py
et ouvrir les données de profil dans kcachegrind avec pyprof2calltree, dont le commutateur-k ouvre automatiquement les données dans kcachegrind
pyprof2calltree -i profile_data.pyprof -k
par exemple profiler le serveur de Pasteur et webapp entier serait fait comme ceci
python -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltree peut être installé avec easy_install.
vous pouvez utiliser profilestats.profile
decorator ( $ pip install profilestats
) -- une enveloppe simple pour pyprof2calltree module (rebranding of lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
Le Script peut être exécuté comme d'habitude. profilestats
crée deux fichiers: cachegrind.out.profilestats
et profilestats.prof
dans les formats compatibles KCachegrind et cprofile.
il peut être fait en utilisant un module externe appelé lscallproftree
cet article explique comment: CherryPy-CacheGrind
avec mon code résultant ressemblant à ceci:
...
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)
...
si quelqu'un connaît une façon de faire cela qui ne nécessite pas un externe (C.-à-d. pas livré avec le module Python), je serais toujours très intéressé d'en entendre parler.
si ce que vous essayez réellement de faire est de voir quelles parties de votre code pourraient être optimisées pour la vitesse, et vous pouvez mettre en pause au hasard dans le débogueur, cette méthode fonctionne . Il peut être surprenant, mais vous n'avez pas besoin de beaucoup stackshots.
3 différentes façons de profiler votre code et de visualiser les résultats dans KCachegrind / Qcachegrind:
I-CPROFILE
1 - Profil mafonction() à partir de ipython
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2 - Convertissez votre fichier en un fichier kcachegrind utilisable dans votre shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Ouvrir callgrind.filename.prof de kcachegrind
II-EMBEDDED CPROFILE
1 - Profil des quelques lignes dans votre code.
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)
2 - Convertissez votre fichier en un fichier kcachegrind utilisable dans votre shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Ouvrir callgrind.filename.prof de kcachegrind
III-YAPPI
1 - Profil mafonction() à partir de ipython ou à partir de votre 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 - Ouvrir callgrind.filename.prof de kcachegrind