この節は ``マニュアルなんか読みたくない人''のために書かれています。こ こではきわめて簡単な概要説明とアプリケーションのプロファイリングを手っ とり早くおこなう方法だけを解説します。
main エントリにある関数 foo() をプロファイルしたいとき、モ ジュールに次の内容を追加します。
import profile profile.run('foo()')
このように書くことで foo() を実行すると同時に一連の情報(プロ ファイル)が表示されます。この方法はインタプリタ上で作業をしている場合、 最も便利なやり方です。プロファイルの結果をファイルに残し、後で検証した いときは、run() の2番目の引数にファイル名を指定します。
import profile profile.run('foo()', 'fooprof')
スクリプトファイル profile.py を使って、別のスクリプトをプロファ イルすることも可能です。次のように実行します。
python -m profile myscript.py
profile.py はオプションとしてコマンドライン引数を2つ受け取りま す。 :
profile.py [-o output_file] [-s sort_order]
-s は標準出力(つまり、 -o が与えられなかった 場合)にのみ有効です。 利用可能なソートの値は、 Stats のドキュメントをご覧ください。
プロファイル内容を確認するときは、pstats モジュールのメソッド を使用します。統計データの読み込みは次のようにします。
import pstats p = pstats.Stats('fooprof')
Stats クラス(上記コードはこのクラスのインスタンスを生成するだ
けの内容です)は p
に読み込まれたデータを操作したり、表示するた
めの各種メソッドを備えています。先に profile.run() を実行し
たとき表示された内容と同じものは、3つのメソッド・コールにより実現でき
ます。
p.strip_dirs().sort_stats(-1).print_stats()
最初のメソッドはモジュール名からファイル名の前に付いているパス部分を取 り除きます。2番目のメソッドはエントリをモジュール名/行番号/名前にもと づいてソートします(旧プロファイラとの構文上の互換性機能)。3番目のメソッ ドで全ての統計情報を出力します。次のようなソート・メソッドも使えます。
p.sort_stats('name') p.print_stats()
最初の行ではリストを関数名でソートしています。2号目で情報を出力してい ます。さらに次の内容も試してください。
p.sort_stats('cumulative').print_stats(10)
このようにすると、関数が消費した累計時間でソートされ、さらにその上位10 件だけを表示します。どのアルゴリズムが時間を多く消費しているのか知りた いときは、この方法が役に立つはずです。
ループで多くの時間を消費している関数はどれか調べたいときは、次のように します。
p.sort_stats('time').print_stats(10)
上記は関数の実行で消費した時間でソートされ、上位10個の関数の情報が表示 されます。
次の内容も試してください。
p.sort_stats('file').print_stats('__init__')
このようにするとファイル名でソートされ、そのうちクラスの初期化メソッド
(メソッド名 __init__
)に関する統計情報だけが表示されます。
p.sort_stats('time', 'cum').print_stats(.5, 'init')
上記は情報を時間 (time) をプライマリ・キー、累計時間 (cumulative time)
をセカンダリ・キーにしてソートした後でさらに条件を絞って統計情報を出力
します。 ".5" は上位 50% だけの選択を意味し、さらにその中から
文字列 init
を含むものだけが表示されます。
どの関数がどの関数を呼び出しているのかを知りたければ、次のようにします
(p
は最後に実行したときの状態でソートされています)。
p.print_callers(.5, 'init')
このようにすると、各関数ごとの呼出し側関数の一覧が得られます。
さらに詳しい機能を知りたければマニュアルを読むか、次の関数の実行結果 から内容を推察してください。
p.print_callees() p.add('fooprof')
スクリプトとして起動した場合、pstats モジュールはプロファイル のダンプを読み込み、分析するための統計ブラウザとして動きます。シンプル な行指向のインターフェース(cmd を使って実装)とヘルプ機能を 備えています。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。