python profiling kcachegrind cprofile

python - Usando los resultados de cProfile con KCacheGrind



profiling (5)

Estoy usando cProfile para perfilar mi programa Python. Sobre la base de esta charla , tenía la impresión de que KCacheGrind podía analizar y mostrar la salida de cProfile.

Sin embargo, cuando voy a importar el archivo, KCacheGrind solo muestra un error de ''Formato de archivo desconocido'' en la barra de estado y no muestra nada.

¿Hay algo especial que deba hacer antes de que mis estadísticas de perfiles sean compatibles 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) ...

Versiones del paquete

  • KCacheGrind 4.3.1
  • Python 2.6.2

3 formas diferentes de perfilar su código y visualizar resultados en KCachegrind / Qcachegrind:

I - CPROFILE

1 - Perfil myfunc () de ipython

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

2 - Convierte tu archivo en un archivo kcachegrind utilizable en tu shell

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

3 - Abre callgrind.filename.prof en kcachegrind

II - CPROFILE INTEGRADO

1 - Perfil de pocas líneas en su código.

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

2 - Convierte tu archivo en un archivo kcachegrind utilizable en tu shell

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

3 - Abre callgrind.filename.prof en kcachegrind

III - YAPPI

1 - Perfil myfunc () desde ipython o desde su código

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 - Abre callgrind.filename.prof en kcachegrind


Con cProfile también puede crear perfiles de los programas existentes, sin realizar ningún script de creación de perfiles por separado. Solo ejecute el programa con perfilador

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

y abrir datos de perfil en kcachegrind con pyprof2calltree, cuyo interruptor -k abre automáticamente los datos en kcachegrind

pyprof2calltree -i profile_data.pyprof -k

Por ejemplo, la creación de perfiles de un servidor de correo electrónico completo y una aplicación web se haría así.

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

pyprof2calltree se puede instalar con easy_install.


Puede usar profilestats.profile decorator ( $ pip install profilestats ) - un envoltorio simple para el módulo pyprof2calltree (cambio de marca de nombre de lsprofcalltree.py ):

from profilestats import profile @profile def func(): # do something here

Script se puede ejecutar como de costumbre. profilestats crea dos archivos: cachegrind.out.profilestats y profilestats.prof en formatos compatibles con KCachegrind y cProfile de manera correspondiente.


Se puede hacer usando un módulo externo llamado lscallproftree

Este artículo explica cómo: CherryPy - CacheGrind

Con mi código resultante pareciendo así:

... 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 alguien conoce una forma de hacer esto que no requiera un módulo externo (es decir, que no se haya enviado con Python), todavía me interesa mucho saberlo.


Si lo que realmente intentas hacer es ver qué partes de tu código podrían optimizarse para la velocidad, y puedes pausarlo aleatoriamente en el depurador, este método funciona . Puede ser sorprendente, pero no necesitas muchas fotos de pila.