# 7 拡張 -- プロファイラの改善

`profile` モジュールおよび `cProfile` モジュールの `Profile` クラスはプロファイラの機 能を拡張するため、派生クラスの作成を前提に書かれています。しかしその方 法を説明するには、`Profile` の内部動作について詳細な解説が必要と なるため、ここでは述べません。もし拡張をおこないたいのであれば、 使用するモジュールのソースを注意深く読む必要があります。

プロファイラが時刻を取得する方法を変更したいだけなら(たとえば、通常の 時間(wall-clock)を使いたいとか、プロセスの経過時間を使いたい場合)、時 刻取得用の関数を `Profile` クラスのコンストラクタに指定すること ができます。

    pr = profile.Profile(your_time_func)

この結果生成されるプロファイラは時刻取得に `your_time_func()` を 呼び出すようになります。

`profile.Profile`
  `your_time_func()` は単一の数値、あるいは その合計が(`os.times()` と同じように)累計時間を示すリストを返 すようになっていなければなりません。関数が1つの数値、あるいは長さ2の数 値のリストを返すようになっていれば、非常に高速に処理が可能になります。

  選択する時刻取得関数によって、プロファイラクラスを補正する必要があるこ とに注意してください。多くのマシンにおいて、プロファイル時のオーバヘッ ドを少なくする方法として、タイマはロング整数を返すのが最善です。 `os.times()` は浮動小数のタプルを返すので おすすめできま せん)。タイマをより正確なものに置き換えたいならば、派生クラスでそのディ スパッチ・メソッドを適切なタイマ呼出しと適切な補正をおこなうように書き 直す必要があります。

`cProfile.Profile`
  `your_time_func()` は単一の数値を返さなければなりません。 もしこれが整数を返す関数ならば、2番目の引数に時間単位当たりの実際の持続 時間を指定してクラスのコンスタラクタを呼び出すことができます。 たとえば、`your_integer_time_func()` が1000分の1秒単位で計測し た時間を返すとすると、`Profile` インスタンスを次のように生成するこ とができます。

      pr = profile.Profile(your_integer_time_func, 0.001)

  `cProfile.Profile` クラスはキャリブレーションができないので、 自前のタイマ関数は注意を払って使う必要があり、またそれは可能な限り 速くなければなりません。自前のタイマ関数で最高の結果を得るには、 `_lsprof` 内部モジュールの C ソースファイルにハードコードする 必要があるかもしれません。