web-dev-qa-db-fra.com

Utilisation des résultats de cProfile avec KCacheGrind

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

  • KCacheGrind 4.3.1
  • Python 2.6.2
53
Adam Luchjenbroers

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.

7
Adam Luchjenbroers

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.

89
Mikael Lepistö

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.

17
jfs

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.

6
Mike Dunlavey

3 façons différentes de profiler votre code et de visualiser les résultats dans KCachegrind/Qcachegrind:

I - PROFIL

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

II - PROFIL INTÉGRÉ

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

III - YAPPI

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

5
Axel Borja