Utilisation des résultats du cProfile avec KCacheGrind

j'utilise cProfile pour profiler mon programme Python. Basé sur cette conversation j'étais sous l'impression que KCacheGrind pourrait Parser et afficher la sortie de cProfile.

cependant, quand je vais importer le fichier, KCacheGrind affiche juste une erreur de "format de fichier inconnu" dans la barre d'état et s'assoit là en n'affichant 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)
...

Les Versions De Package

  • KCacheGrind 4.3.1
  • Python 2.6.2
47
demandé sur Adam Luchjenbroers 2009-12-13 12:43:00

5 réponses

avec cProfile vous pouvez également profiler des programmes existants, sans faire de script de profilage séparé. Il suffit de lancer le programme avec profiler

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 profiler le serveur de Pasteur et webapp entier serait fait comme ceci

python -m cProfile -o pyprof.out `which paster` serve development.ini

pyprof2calltree peut être installé avec easy_install.

83
répondu Mikael Lepistö 2010-08-24 22:26:25

vous pouvez utiliser profilestats.profile decorator ( $ pip install profilestats ) -- une enveloppe simple pour pyprof2calltree module (rebranding of 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.

17
répondu jfs 2010-03-28 22:01:10

il 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 une façon de faire cela qui ne nécessite pas un externe (C.-à-d. pas livré avec le module Python), je serais toujours très intéressé d'en entendre parler.

7
répondu Adam Luchjenbroers 2009-12-13 10:40:34

si ce que vous essayez réellement de faire est de voir quelles parties de votre code pourraient être optimisées 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 beaucoup stackshots.

6
répondu Mike Dunlavey 2017-05-23 10:31:00

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

I-CPROFILE

1 - Profil mafonction() à partir de 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 - Ouvrir callgrind.filename.prof de kcachegrind

II-EMBEDDED CPROFILE

1 - Profil des 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 - Ouvrir callgrind.filename.prof de kcachegrind

III-YAPPI

1 - Profil mafonction() à partir de ipython ou à partir 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 - Ouvrir callgrind.filename.prof de kcachegrind

3
répondu Axel Borja 2016-10-03 09:49:56