J’utilise cProfile pour profiler mon programme Python. Sur la base de cette discussion, j’avais l’impression que KCacheGrind pouvait parsingr 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 affiche rien.
Y a-t-il quelque chose de spécial à faire avant que mes statistiques de profilage 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 de package
Avec cProfile, vous pouvez également profiler des programmes existants sans créer de script de profilage distinct. Exécutez simplement 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 l’option -k ouvre automatiquement les données dans kcachegrind
pyprof2calltree -i profile_data.pyprof -k
Par exemple, le profilage complet du serveur 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 le décorateur profilestats.profile
( $ pip install profilestats
) – un simple wrapper pour le module pyprof2calltree (rebranding 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
dans les formats compatibles KCachegrind et cProfile.
Cela peut être fait en utilisant un module externe appelé lscallproftree
Cet article explique comment: CherryPy – CacheGrind
Avec mon code résultant ressemblant ainsi:
... 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 sait comment faire cela sans avoir besoin d’un module externe (c’est-à-dire non fourni avec Python), je serais toujours très intéressé d’en entendre parler.
Si ce que vous essayez de faire est de voir quelles parties de votre code peuvent être optimisées pour la vitesse, et que 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 beaucoup de photos de stacks.
3 façons différentes de profiler votre code et de visualiser les résultats dans KCachegrind / Qcachegrind:
1 – Profil myfunc () de ipython
import cProfile filename = 'filename.prof' cProfile.run('myfunc()', filename)
2 – Convertissez votre fichier en 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 – Profiler 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 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 () d’ipython ou 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 – Ouvrez callgrind.filename.prof dans kcachegrind