Usando resultados Cprofile com KCachegrind
-
19-09-2019 - |
Pergunta
Eu estou usando Cprofile ao perfil meu programa Python. Com base essa conversa Eu estava sob a impressão de que o KCachegrind pôde analisar e exibir a saída do Cprofile.
No entanto, quando eu ir para importar o arquivo, o KCachegrind apenas exibe um erro 'Formato de ficheiro desconhecido' na barra de status e fica lá exibindo nada.
Existe algo especial que eu preciso fazer antes de minhas estatísticas de perfis são compatíveis com o 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)
...
Versões de Pacotes
- KCachegrind 4.3.1
- Python 2.6.2
Solução 3
Isso pode ser feito usando um módulo externo chamado lscallproftree
Este artigo explica como: CherryPy - Cachegrind
Com o meu código resultante olhando assim:
...
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 alguém sabe uma maneira de fazer isso que não requer um externo (ie. Não fornecido com Python) módulo, eu ainda estaria muito interessado em ouvir sobre isso.
Outras dicas
Com Cprofile você também pode perfil programas existentes, sem fazer qualquer script de perfil separado. Basta executar programa com profiler
python -m cProfile -o profile_data.pyprof script_to_profile.py
e perfil aberto dados em kcachegrind com pyprof2calltree, cuja chave k abre automaticamente os dados em kcachegrind
pyprof2calltree -i profile_data.pyprof -k
Por exemplo profiling servidor paster todo e webapp seria feito como este
python -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltree pode ser instalado com easy_install.
Você pode usar profilestats.profile
decorador ($ pip install profilestats
) - de uma capa simples para pyprof2calltree módulo (rebranding de lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
Script pode ser executado como de costume. profilestats
cria dois arquivos:. cachegrind.out.profilestats
e profilestats.prof
no KCachegrind compatível e Cprofile formata correspondentemente
Se o que você está realmente tentando fazer é ver o que partes de seu código pode ser otimizado para velocidade, e você pode pausá-lo aleatoriamente no depurador, este método funciona . Pode ser surpreendente, mas você não precisa de muitas stackshots.
3 diferentes maneiras de perfil de seu código e resultados visualizando no KCachegrind / Qcachegrind:
I - CPROFILE
1 - myfunc perfil () de ipython
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2 - converter o arquivo para um arquivo kcachegrind utilizável em sua shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Open callgrind.filename.prof em kcachegrind
II - EMBEDDED CPROFILE
1 -. Perfil algumas linhas em seu código
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)
2 - converter o arquivo para um arquivo kcachegrind utilizável em sua shell
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - Open callgrind.filename.prof em kcachegrind
III - YAPPI
1 - myfunc perfil () de ipython ou do seu 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 - Abrir callgrind.filename.prof em kcachegrind