2012-02-23 9 views
2

可能性の重複:
How to profile my code?Pythonコードのプロファイリングとパフォーマンステストのベストプラクティスとツールは何ですか?

いただきましたプロファイリングおよびパフォーマンステストのpythonコードのためのベストプラクティスとツールはありますか? クイック勝利または推奨事項。

CProfileの継ぎ目といくつかの素晴らしいメモ/以下の回答は、どちらも非常に良い回答/チュートリアルです。投票してください。私は1日か2日でトップのものを選びます。ありがとう@senderleと@ campos.ddc

問題のある領域が見つかったら、コードを変換してより速くするというイディオムやヒントがありますか?

+0

すばらしいリンク、thanks Rik。私はそれをチェックします。プロファイリング以外のイディオムはありますか? –

+0

* [ここで簡単に勝つことができます。](http://stackoverflow.com/questions/4295799/how-to-improve-performance-of-this-code/4299378#4299378)* –

答えて

2

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は、サブファンクションコールで費やされた時間であるを除いて、ファンクションで費やされた合計時間で、です。 percalltottime/ncallsです。 cumtimeは、に費やされた時間で、には、サブ関数呼び出しに費やされた時間が含まれています。残りのデータは、filename:lineno(func_name)です。

ほとんどの場合、最初にncallstottimeを見てください。上記のデータでは、このプログラムによって費やされた時間の大部分がextract_numberにあることがわかります。さらに、extract_numberと多く、(1000014)回と呼ばれていることがわかります。したがって、私がextract_numberをスピードアップするためにできることは、このテストコードの実行を大幅に高速化します。それが私にマイクロ秒を得た場合、ゲインは1000014で乗算され、完全な2番目のゲインになります。

次に、generate_numbersで作業する必要があります。利益はそれほど重要ではありませんが、依然として重要であるかもしれません。その機能がもう7秒も燃え尽きるので、いくつかの利点があります。

それはあなたに一般的な考えを与えるはずです。ただし、たとえば、再帰の場合には、tottime番号が誤っていることがあります。

+0

ありがとうございました。結果を解釈し、それらを行動する? –

+0

@MattAlcockプロファイリングに関するpythonの公式ドキュメントをチェックしたいと思うかもしれません:http://docs.python.org/library/profile.html –