En utilisant les résultats cprofile avec KCacheGrind
-
19-09-2019 - |
Question
J'utilise cprofile au profil de mon programme Python. Sur la base ce discours j'avais l'impression que KCacheGrind pourrait analyser et afficher la sortie de cprofile.
Cependant, quand je vais à importer le fichier, KCacheGrind affiche juste une erreur « Unknown Format de fichier » dans la barre d'état et est assis là rien afficher.
Y at-il quelque chose de spécial que je dois faire avant mes statistiques de profilage sont 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 l'emballage
- KCacheGrind 4.3.1
- Python 2.6.2
La solution 3
Il peut être fait en utilisant un module externe appelé lscallproftree
Cet article explique comment: CherryPy - cachegrind
Avec mon code résultant à la recherche comme 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 faire ce qui ne nécessite pas un externe (ie. Pas livré avec Python) module, je serais toujours très intéressé à entendre parler.
Autres conseils
Avec cprofile vous pouvez également le profil des programmes existants, sans faire un script de profilage séparé. Il suffit de lancer le programme avec profileur
python -m cProfile -o profile_data.pyprof script_to_profile.py
et les données de profil ouvert en kcachegrind avec pyprof2calltree, dont le commutateur -k ouvre automatiquement les données dans kcachegrind
pyprof2calltree -i profile_data.pyprof -k
Par exemple tout le serveur Paster profilage et webapp 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
décorateur ($ pip install profilestats
) - une enveloppe simple pour pyprof2calltree module (changement de nom de lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
script peut être exécuté comme d'habitude. profilestats
crée deux fichiers:. cachegrind.out.profilestats
et profilestats.prof
en compatible KCachegrind et formats cprofile en conséquence
Si ce que vous êtes en train d'essayer de faire est de voir quelles parties de votre code pourraient être optimisés 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 très nombreux stackshots.
3 différents façons de profil de votre code et visualisant les résultats dans KCachegrind / Qcachegrind:
I - cprofile
1 - Profil myfunc () à partir de ipython
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2 - Convertir votre fichier dans un fichier kcachegrind utilisable dans votre shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - callgrind.filename.prof Open in kcachegrind
II - EMBEDDED cprofile
1 -. Profil 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 - Convertir votre fichier dans un fichier kcachegrind utilisable dans votre shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - callgrind.filename.prof Open in kcachegrind
III - Yappi
1 - Profil myfunc () de 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 - callgrind.filename.prof Open in kcachegrind