#
10.3 インスタント・ユーザ・マニュアル

この節は ``マニュアルなんか読みたくない人''のために書かれています。こ こではきわめて簡単な概要説明とアプリケーションのプロファイリングを手っ とり早くおこなう方法だけを解説します。

main エントリにある関数 "`foo()`" をプロファイルしたいとき、モジュー ルに次の内容を追加します。

    import profile
    profile.run('foo()')

このように書くことで "`foo()`" を実行すると同時に一連の情報(プロファ イル)が表示されます。この方法はインタプリタ上で作業をしている場合、最 も便利なやり方です。プロファイルの結果をファイルに残し、後で検証したい ときは、`run()` の2番目の引数にファイル名を指定します。

    import profile
    profile.run('foo()', 'fooprof')

スクリプトファイル profile.py を使って、別のスクリプトをプロファ イルすることも可能です。次のように実行します。

    python /usr/local/lib/python1.5/profile.py myscript.py

プロファイル内容を確認するときは、`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` を使って実装)とヘルプ機能を 備えています。