Tenho usado o cProfile para criar o perfil do meu código e está funcionando muito bem. Também uso gprof2dot.py para visualizar os resultados (torna-o um pouco mais claro).
No entanto, cProfile (e a maioria dos outros criadores de perfil Python que vi até agora) parecem ter perfil apenas no nível de chamada de função. Isso causa confusão quando certas funções são chamadas de lugares diferentes - não tenho ideia se a chamada 1 ou 2 está ocupando a maior parte do tempo. Isso fica ainda pior quando a função em questão tem seis níveis de profundidade, chamada de sete outros lugares.
Como faço para obter um perfil linha por linha?
Em vez disso:
function #12, total time: 2.0s
Eu gostaria de ver algo assim:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile mostra quanto do tempo total "transfere" para o pai, mas novamente essa conexão é perdida quando você tem um monte de camadas e chamadas interconectadas.
Idealmente, adoraria ter uma GUI que analisasse os dados e, em seguida, mostrasse meu arquivo de origem com um tempo total atribuído a cada linha. Algo assim:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Então, eu seria capaz de clicar na segunda chamada "func (c)" para ver o que está demorando nessa chamada, separada da chamada "func (a)".
Isso faz sentido? Existe alguma biblioteca de perfis que coleta esse tipo de informação? Existe alguma ferramenta incrível que eu perdi?
fonte
pstats.print_callers
. Um exemplo está aqui .Respostas:
Eu acredito que é para isso que o line_profiler de Robert Kern se destina. Do link:
Espero que ajude!
fonte
import line_profiler;
e depois ?Você também pode usar pprofile ( pypi ). Se você deseja traçar o perfil de toda a execução, não requer modificação do código-fonte. Você também pode criar o perfil de um subconjunto de um programa maior de duas maneiras:
alterne a criação de perfil ao atingir um ponto específico no código, como:
alternar a criação de perfil de forma assíncrona da pilha de chamadas (requer uma maneira de acionar este código em um aplicativo considerado, por exemplo, um manipulador de sinal ou um thread de trabalho disponível) usando a criação de perfil estatística:
O formato de saída da anotação de código é muito parecido com o gerador de perfil de linha:
Observe que, como pprofile não depende de modificação de código, ele pode criar perfis de instruções de módulo de nível superior, permitindo definir o perfil do tempo de inicialização do programa (quanto tempo leva para importar módulos, inicializar globais, ...).
Ele pode gerar saída formatada em cachegrind, então você pode usar kcachegrind para navegar facilmente por grandes resultados.
Divulgação: Eu sou o autor pprofile.
fonte
Você pode obter ajuda do pacote line_profiler para este
1. Primeiro instale o pacote:
2. Use o comando mágico para carregar o pacote em seu ambiente python / notebook
3. Se você deseja traçar o perfil dos códigos para uma função,
faça o seguinte:
você obterá uma boa saída formatada com todos os detalhes se seguir estas etapas :)
fonte
Apenas para melhorar a resposta de @Joe Kington acima mencionada .
Para Python 3.x , use line_profiler :
Instalação:
Uso:
Suponha que você tenha o programa
main.py
e, dentro dele, funçõesfun_a()
efun_b()
que deseja traçar um perfil com relação ao tempo; você precisará usar o decorador@profile
antes das definições de função. Por exemplo,O perfil do programa pode ser traçado executando o comando shell:
Os argumentos podem ser obtidos usando
$ kernprof -h
Os resultados serão impressos no console como:
EDIT: Os resultados dos profilers podem ser analisados usando o pacote TAMPPA . Usando-o, podemos obter gráficos desejados linha por linha como
fonte
O PyVmMonitor possui uma visualização ao vivo que pode ajudá-lo (você pode se conectar a um programa em execução e obter estatísticas dele).
Veja: http://www.pyvmmonitor.com/
fonte