Quais são as melhores práticas e ferramentas para traçar perfis e testar o desempenho do código python? [duplicado]

possível duplicado:
Como traçar o meu código?

Quais são as melhores práticas e ferramentas para o desenvolvimento de perfis e testes de desempenho do código python? Qualquer vitória rápida aqui ou recomendações.

O CProfile parece popular e algumas grandes notas / Respostas abaixo, ambas são respostas muito boas / tutoriais. Votem fora e eu escolho o melhor num dia ou dois. Obrigado @senderle e @ campos.ddc

Uma vez que uma área de problema é encontrado, existem alguns idiomas e / ou dicas para converter código para torná-lo mais rápido?

Author: Community, 2012-02-23

1 answers

cProfile é a ferramenta clássica de perfis. A maneira básica de usá-lo é assim:

python -m cProfile myscript.py
Aqui chamei - o na rotina de teste de uma implementação de referência do twister de mersenne que escrevi.
me@mine $ python -m cProfile mersenne.twister.py 
True
True
1000000
         1003236 function calls in 2.163 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.163    2.163 <string>:1(<module>)
        1    0.001    0.001    2.162    2.162 mersenne.twister.py:1(<module>)
        3    0.001    0.000    0.001    0.000 mersenne.twister.py:10(init_gen)
  1000014    1.039    0.000    1.821    0.000 mersenne.twister.py:19(extract_number)
        1    0.000    0.000    0.000    0.000 mersenne.twister.py:3(Twister)
     1603    0.766    0.000    0.782    0.000 mersenne.twister.py:33(generate_numbers)
        1    0.000    0.000    0.000    0.000 mersenne.twister.py:4(__init__)
        1    0.317    0.317    2.161    2.161 mersenne.twister.py:42(_test)
        1    0.001    0.001    2.163    2.163 {execfile}
        1    0.000    0.000    0.000    0.000 {len}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
     1608    0.038    0.000    0.038    0.000 {range}

ncalls é o número de vezes que uma função foi chamada. tottime é o tempo total gasto numa função, excluindo o tempo gasto em chamadas sub-funções. percall é tottime / ncalls. cumtime é o tempo gasto na função incluindo o tempo gasto em chamadas sub-funções. E os restantes dados são os seguintes: filename:lineno(func_name).

Na maioria dos casos, olhe para ncalls e tottime primeiro. Nos dados acima, você pode ver que a grande maioria do tempo gasto por este programa acontece em extract_number. Além disso, podemos ver que extract_number é chamado muitas (1000014) vezes. Então tudo o que eu puder fazer para acelerar extract_number irá acelerar significativamente a execução deste código de teste. Se me ganhar um microssegundo , então o ganho será multiplicado por 1000014, resultando em um segundo ganho completo.

Então devo trabalhar em generate_numbers. Os ganhos não vão importar tanto ,mas podem ser significativos, e como essa função queima outra.7 segundos, há algum benefício a ser tido. Isso deve dar-te a ideia geral. Note, no entanto, que o número tottime às vezes pode ser enganoso, em casos de recursão, por exemplo.
 3
Author: senderle, 2012-02-23 01:22:07