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.