Pregunta

Estoy usando cprofile al perfil mi programa Python. Sobre la base de esta charla que estaba bajo la impresión de que KCachegrind podría analizar y mostrar la salida de cprofile.

Sin embargo, cuando voy a importar el archivo, kcachegrind sólo muestra un error 'Unknown Formato de archivo' en la barra de estado y se sienta allí mostrando nada.

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

Las versiones paquete

  • kcachegrind 4.3.1
  • Python 2.6.2
¿Fue útil?

Solución 3

Se puede hacer uso de un módulo externo llamado lscallproftree

En este artículo se explica cómo: CherryPy - Cachegrind

Con mi código resultante en busca de esta manera:

...
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 manera de hacer esto que no requiere una externa (es decir. No envía con Python) módulo, todavía estaría muy interesado en escuchar al respecto.

Otros consejos

Con cprofile también se puede perfilar programas existentes, sin hacer ningún guión perfilado separado. Sólo tiene que ejecutar el programa con perfiles

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

y de perfil abierto de datos en kcachegrind con pyprof2calltree, cuya -k interruptor se abre automáticamente los datos en kcachegrind

pyprof2calltree -i profile_data.pyprof -k

Por ejemplo perfiles de servidor de aplicación web parche conjunto y se llevaría a cabo como esto

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

pyprof2calltree se puede instalar con easy_install.

Se puede usar profilestats.profile decorador ($ pip install profilestats) - un simple envoltorio para pyprof2calltree módulo (cambio de marca 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 KCachegrind compatible con los formatos y cprofile correspondientemente

Si lo que en realidad estamos tratando de hacer es ver qué partes de su código se podrían optimizar para la velocidad, y se puede hacer una pausa al azar en el depurador, Producción este método. Puede resultar sorprendente, pero usted no necesita muchos stackshots.

3 diferentes formas de perfil de su código y visualización de resultados en KCachegrind / Qcachegrind:

I - cprofile

1 - Perfil myfunc () desde ipython

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

2 - Convertir el archivo a un archivo kcachegrind utilizable en su shell

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

3 - callgrind.filename.prof Abrir en kcachegrind

II - EMBEDDED cprofile

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

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

2 - Convertir el archivo a un archivo kcachegrind utilizable en su shell

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

3 - callgrind.filename.prof Abrir en kcachegrind

III - YAPPI

1 - Perfil myfunc () desde ipython o de 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 - callgrind.filename.prof Abrir en kcachegrind

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top