blog.monophile.net

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 現在は digitiminimi Inc. において、インフラエンジニアとして生計をたててている。 また、計算を主題に制作を行い、現代音楽作品や公共インスタレーション作品など技術提供を行う。 三輪眞弘に師事する。

List

python cProfile の使い方メモ

いきさつ

一般的に、プロファイラなしでプログラムの最適化はすべきではないと言われているので、 使ってみます。 ProfileとcProfileの2種類あるようなのですが、 今回は動作の速いcProfileを使います。

Hello

シンプルにHelloと出力します。

## test.py ##
def hello():
    print "hello"

if __name__ == "__main__":
    hello()

プロファイラをもちいて実行

以下のコマンドでtest.prfが出力されます。

$ python -m cProfile -o test.prf test.py

test.prfを読む

test.prfはバイナリデータなので、普通のページャでは読めません。 したがって、pstatsというモジュールを使います。

$ python -m pstats ./test.prf
Welcome to the profile statistics browser.
./test.prof% stats
Sun Dec 29 21:03:36 2013    ./test.prof

         3 function calls in 0.000 seconds

   Random listing order was used

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 test.py:2(hello)
        1    0.000    0.000    0.000    0.000 test.py:2()
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


./test.prof%

起動するとshellが立ち上がるので、statsというコマンドを打つと表示してくれます。 表示する行数Nは“stats N”という形で指定できます。 “help COMMAND”で使い方を提示してくれます。

pstatsをモジュールとして使う

以下のファイルをstats.pyとします。

## stats.py ##
import sys
import pstats as ps

p = ps.Stats(sys.argv[1])
p.sort_stats('time').print_stats(10)

そして以下のコマンドを打つと上記とほぼ同等の出力が得られます。

$ python stats.py ./test.prf