# 26.5. `hotshot` --- ハイパフォーマンス・ロギング・プロファイラ

バージョン 2.2 で追加.

このモジュールは `_hotshot` C モジュールへのより良いインターフェースを提供します。Hotshot は既存の `profile` に置き換わるものです。その大半が C で書かれているため、 `profile` に比べパフォーマンス上の影響がはるかに少なく済みます。

注釈

`hotshot` は C モジュールでプロファイル中のオーバーヘッドを極力小さくすることに焦点を絞っており、その代わりに後処理時間の長さというつけを払います。通常の使用法についてはこのモジュールではなく `cProfile` を使うことを推奨します。 `hotshot` は保守されておらず、将来的には標準ライブラリから外されるかもしれません。

バージョン 2.5 で変更: 以前より意味のある結果が得られているはずです。かつては時間計測の中核部分に致命的なバグがありました.

注釈

`hotshot` プロファイラはまだスレッド環境ではうまく動作しません。測定したいコード上でプロファイラを実行するためにスレッドを使わない版のスクリプトを使う方法が有用です。

class `hotshot.``Profile`(logfile[, lineevents[, linetimings]])

  プロファイラ・オブジェクト。引数 logfile はプロファイル・データのログを保存するファイル名です。引数 lineevents はソースコードの1 行ごとにイベントを発生させるか、関数の呼び出し/リターンのときだけ発生させるかを指定します。デフォルトの値は `0` (関数の呼び出し/ リターンのときだけログを残す) です。引数 linetimings は時間情報を記録するかどうかを指定します。デフォルトの値は `1` (時間情報を記録する) です。

## 26.5.1. Profile オブジェクト

Profile オブジェクトには以下のメソッドがあります:

`Profile.``addinfo`(key, value)

  プロファイル出力の際、任意のラベル名を追加します。

`Profile.``close`()

  ログファイルを閉じ、プロファイラを終了します。

`Profile.``fileno`()

  プロファイラのログファイルのファイル・デスクリプタを返します。

`Profile.``run`(cmd)

  スクリプト環境で `exec` 互換文字列のプロファイルをおこないます。 `__main__` モジュールのグローバル変数は、スクリプトのグローバル変数、ローカル変数の両方に使われます。

`Profile.``runcall`(func, *args, **keywords)

  単一の呼び出し可能オブジェクトのプロファイルをおこないます。位置依存引数やキーワード引数を追加して呼び出すオブジェクトに渡すこともできます。呼び出しの結果はそのまま返されます。例外が発生したときはプロファイリングが無効になり、例外をそのまま伝えるようになっています。

`Profile.``runctx`(cmd, globals, locals)

  指定した環境で `exec` 互換文字列の評価をおこないます。文字列のコンパイルはプロファイルを開始する前におこなわれます。

`Profile.``start`()

  プロファイラを開始します。

`Profile.``stop`()

  プロファイラを停止します。

## 26.5.2. hotshot データの利用

バージョン 2.2 で追加.

このモジュールは hotshot プロファイル・データを標準の `pstats` Stats オブジェクトにロードします。

`hotshot.stats.``load`(filename)

  filename から hotshot データを読み込み、 `pstats.Stats` クラスのインスタンスを返します。

参考

`profile` モジュール
  `profile` モジュールの `Stats` クラス

## 26.5.3. 使用例

これは Python の "ベンチマーク" pystone を使った例です。実行にはやや時間がかかり、巨大な出力ファイルを生成するので注意してください。

    >>> import hotshot, hotshot.stats, test.pystone
    >>> prof = hotshot.Profile("stones.prof")
    >>> benchtime, stones = prof.runcall(test.pystone.pystones)
    >>> prof.close()
    >>> stats = hotshot.stats.load("stones.prof")
    >>> stats.strip_dirs()
    >>> stats.sort_stats('time', 'calls')
    >>> stats.print_stats(20)
             850004 function calls in 10.090 CPU seconds

       Ordered by: internal time, call count

       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    3.295    3.295   10.090   10.090 pystone.py:79(Proc0)
       150000    1.315    0.000    1.315    0.000 pystone.py:203(Proc7)
        50000    1.313    0.000    1.463    0.000 pystone.py:229(Func2)
     .
     .
     .