2011年9月18日日曜日

Pythonスクリプトの実行時間をメソッドごとに評価する「Python-profiler」が凄い」

Hacker Newsに上がっていた記事「Run,Python,Run!」で扱っているスクリプト、Python Profilerが凄い。

何が凄いって、Pythonでかかれたスクリプトの実行時間を、メソッドごとに計測し、グラフィカルに表示してくれるのだ。

試しに使ってみたが、これは素晴らしかった。

#vim encoding=utf8
def loop(x):
    for i in range(x):
        print "やっほー"

def loop_list(x):
    yahho = []
    for i in range(x):
        yahho.append("やっほー")

yahhoi = loop_list(1000)
loop(1000)

上記のスクリプトを実行し、プロファイルしてみたのが以下


loopが時間を食っていること、更に、loop_list内で実行されているappend()の実行にどれだけ時間を食っているかも分かるのだ。
ちなみにこれ、モジュール内で更に関数を実行していた場合、再帰的に実行時間を計測出来る。
例えば、関数内でurllibのurlopenを実行していた場合、urlopen内で実行されているsocketオブジェクトのメソッドであるconnect_ofの実行時間を計測出来たりもする。
更に深いところになるとまた違う手法を求められるのであろうが(筆者にその知識はない)、しかし、手掛かりを簡単に掴めるというだけでも、使ってみる価値はあるのではなかろうか。

では、インストール方法の説明である。

コンソールに行き、

sudo apt-get install python-profiler python-wxgtk2.8 python-setuptools
sudo easy_install SquareMap RunSnakeRun

たったこれだけだ。

プロファイルの作成方法であるが、

python -m cProfile -o outputfilename  pythonscript script_arguments

こちらのフォーマットに従ってくれれば問題ない。
筆者の行った例で言えば、計測したいスクリプト名が「test.py」、出力したいプロファイル名が「output」であったから、

python -m cProfile -o output test.py

と、した。
プロファイルを見る場合は、

runsnake output

とすればよい。
日頃行っているサービスのパフォーマンス改善は勿論のこと、競技プログラミングで手詰まりを起こした際にも役立つ場面がある(?)のではなかろうか。