J'utilise cProfile pour profiler mon Python. Basé sur cet exposé j'avais l'impression que KCacheGrind pourrait analyser et afficher la sortie de cProfile.
Cependant, lorsque je vais importer le fichier, KCacheGrind affiche simplement une erreur "Format de fichier inconnu" dans la barre d'état et n'y reste 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)
...
Versions du package
Cela 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 un moyen de le faire qui ne nécessite pas de module externe (c'est-à-dire non fourni avec Python), je serais toujours très intéressé d'en entendre parler.
Avec cProfile, vous pouvez également profiler des programmes existants, sans créer de script de profilage séparé. Il suffit d'exécuter le programme avec le profileur
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, le profilage de l'ensemble du serveur paster et de l'application Web se ferait 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
décorateur ($ pip install profilestats
) - un simple wrapper pour le module pyprof2calltree (changement de nom de 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
aux formats compatibles avec KCachegrind et cProfile en conséquence.
Si ce que vous essayez de faire, c'est de voir quelles parties de votre code pourraient être optimisées pour la vitesse, et vous pouvez le mettre en pause de manière aléatoire dans le débogueur, cette méthode fonctionne . Cela peut être surprenant, mais vous n'avez pas besoin de très nombreux coups de pile.
3 façons différentes de profiler votre code et de visualiser les résultats dans KCachegrind/Qcachegrind:
1 - Profil myfunc () d'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 - Ouvrez callgrind.filename.prof dans kcachegrind
1 - Profilez 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 - Ouvrez callgrind.filename.prof dans kcachegrind
1 - Profil myfunc () depuis ipython ou depuis 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 - Ouvrez callgrind.filename.prof dans kcachegrind