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
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top