Domanda

sto usando Cprofile al profilo il mio programma Python. Sulla base di questo discorso ho avuto l'impressione che KCachegrind in grado di analizzare e visualizzare l'output da Cprofile.

Tuttavia, quando vado a importare il file, KCachegrind appena viene visualizzato un errore 'Unknown File Format' nella barra di stato e si siede lì la visualizzazione di nulla.

C'è qualcosa di speciale che ho bisogno di fare prima le mie statistiche di profiling sono compatibili con 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)
...

Versioni Package

  • KCachegrind 4.3.1
  • Python 2.6.2
È stato utile?

Soluzione 3

Si può essere fatto utilizzando un modulo esterno chiamato lscallproftree

In questo articolo viene spiegato come: CherryPy - Cachegrind

Con il mio codice risultante cercando in questo modo:

...
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)
...

Se qualcuno conosce un modo per fare ciò che non necessita di un esterno (es. Non fornito con Python) modulo, sarei ancora molto interessato a sentire su di esso.

Altri suggerimenti

Con Cprofile è possibile anche il profilo dei programmi esistenti, senza fare qualsiasi script di profili separati. Basta eseguire il programma con il profiler

python -m cProfile -o profile_data.pyprof script_to_profile.py

e profili aperti dati in kcachegrind con pyprof2calltree, il cui interruttore -k apre automaticamente i dati in kcachegrind

pyprof2calltree -i profile_data.pyprof -k

Per esempio profilatura intero server paster e webapp sarebbe fatto come questo

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

pyprof2calltree può essere installato con easy_install.

Si potrebbe utilizzare profilestats.profile decoratore ($ pip install profilestats) - un semplice wrapper per pyprof2calltree modulo (rebranding di lsprofcalltree.py):

from profilestats import profile

@profile
def func():
    # do something here

Script può essere eseguito come di consueto. profilestats crea due file:. cachegrind.out.profilestats e profilestats.prof in KCachegrind-compatibile e Cprofile formati corrispondentemente

Se state realmente cercando di fare è vedere quali parti del codice potrebbero essere ottimizzate per la velocità, e si può mettere in pausa in modo casuale nel debugger, questo metodo funziona . Può essere sorprendente, ma non c'è bisogno molti stackshots.

3 differenti modi nel proprio profilo codice e risultati visualizzando in KCachegrind / Qcachegrind:

I - Cprofile

1 - Profilo myfunc () da ipython

import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)

2 - Convertire il file in un file kcachegrind utilizzabile nella shell

sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3 - Aprire callgrind.filename.prof in kcachegrind

II - EMBEDDED Cprofile

1 -. Profilo poche righe nel codice

import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)

2 - Convertire il file in un file kcachegrind utilizzabile nella shell

sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3 - Aprire callgrind.filename.prof in kcachegrind

III - YAPPI

1 - Profilo myfunc () dal ipython o dal codice

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 - Aprire callgrind.filename.prof in kcachegrind

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top