Utilizando los resultados cprofile con kcachegrind
-
19-09-2019 - |
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
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