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 が高い物を探して修正することになります。