2009年5月27日

Pythonでパフォーマンス計測

Pythonでパフォーマンスチュニングをしたい場合、Python 2.5 以上なのであれば cProfile を利用してまずどこが遅いのかを計測します。

サンプルソースは以下みたいになります。

import cProfile, pstats, StringIO

prof = cProfile.Profile()
# 関数 main() の速度を計測しています
prof = prof.runctx("main()", globals(), locals())

stream = StringIO.StringIO()
stats = pstats.Stats(prof, stream=stream)

# cumulative で sort します
stats.sort_stats("cumulative")
# 上位 80%まで出力します
stats.print_stats(80)

# たとえばこうやると "docuitls" という名前のつく物だけ上位 10 % を出力します
stats.print_stats("docutils", .1)
# 以下2行はオプション

# stats.print_callees("docutils")
#stats.print_callers("rst", .1)
# 結果をログに出力してみます
logging.info("Profile data:\n%s", stream.getvalue())

logging.info の所は計測したい物がフレームワークを利用したプログラムだったりした場合は、プレームワークのログ機能に変更した方が良いかもしれません。

sort_stats の引数に利用できるキーは以下のような物があります。

出力内容に表示される文字の意味
キー名 意味
'cumulative' 累積時間
'file' ファイル名
'module' モジュール名
'pcalls' プリミティブな呼び出しの回数
'line' 行番号
'name' 関数名
'nfl' 関数名/ファイル名/行番号
'stdname' 標準名
'time' 内部時間

cumulative が大きい物ほど処理に時間がかかっています。

pcalls と time を見て pcalls が異常に多いとか time が高い物を探して修正することになります。

blog comments powered by Disqus