Quais são as melhores práticas e ferramentas para traçar perfis e testar o desempenho do código python? [duplicado]
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.possível duplicado:
Como traçar o meu código?
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?
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.
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.