Utilisation des résultats de cProfile avec KCacheGrind

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

  • KCacheGrind 4.3.1
  • Python 2.6.2

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:

I – CPROFILE

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

II – CPROFILE EMBARQUÉ

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

III – YAPPI

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