cProfile
は、古典的なプロファイリングツールです。それを使用するための基本的な方法はlike soです:
python -m cProfile myscript.py
ここで私は私が書いたmersenne twisterのリファレンス実装のテストルーチンでそれを呼んでいます。
[email protected] $ 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
は、関数が呼び出された回数です。 tottime
は、サブファンクションコールで費やされた時間であるを除いて、ファンクションで費やされた合計時間で、です。 percall
はtottime/ncalls
です。 cumtime
は、に費やされた時間で、には、サブ関数呼び出しに費やされた時間が含まれています。残りのデータは、filename:lineno(func_name)
です。
ほとんどの場合、最初にncalls
とtottime
を見てください。上記のデータでは、このプログラムによって費やされた時間の大部分がextract_number
にあることがわかります。さらに、extract_number
がと多く、(1000014)回と呼ばれていることがわかります。したがって、私がextract_number
をスピードアップするためにできることは、このテストコードの実行を大幅に高速化します。それが私にマイクロ秒を得た場合、ゲインは1000014で乗算され、完全な2番目のゲインになります。
次に、generate_numbers
で作業する必要があります。利益はそれほど重要ではありませんが、依然として重要であるかもしれません。その機能がもう7秒も燃え尽きるので、いくつかの利点があります。
それはあなたに一般的な考えを与えるはずです。ただし、たとえば、再帰の場合には、tottime
番号が誤っていることがあります。
すばらしいリンク、thanks Rik。私はそれをチェックします。プロファイリング以外のイディオムはありますか? –
* [ここで簡単に勝つことができます。](http://stackoverflow.com/questions/4295799/how-to-improve-performance-of-this-code/4299378#4299378)* –