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?
pstats.print_callers
. Um exemplo está aqui .