# 3 決定論的プロファイリングとは何か?

決定論的プロファイリングとは、すべての 関数呼出し、関数からのリターン、例外発生をモニターし、正確なタイミングを 記録することで、イベント間の時間、つまりどの時間にユーザ・コードが実行 されているのかを計測するやり方です。もう一方の統計学的プロファイ リング(このモジュールでこの方法は採用していません)とは、有効なインス トラクション・ポインタからランダムにサンプリングをおこない、プログラム のどこで時間が使われているかを推定する方法です。後者の方法は、オーバヘッ ドが少いものの、プログラムのどこで多くの時間が使われているか、その相対 的な示唆に留まります。

Python の場合、実行中必ずインタプリタが動作するため、決定論的プロファ イリングをおこなうにあたり、計測用のコードは必須ではありません。Python は自動的に各イベントにフック(オプションとしてコールバック)を提供 します。Python インタプリタの特性として、大きなオーバーヘッドを伴う傾 向がありますが、一般的なアプリケーションに決定論的プロファイリングを用 いると、プロセスのオーバーヘッドは少くて済む傾向があります。結果的に決 定論的プロファイリングは少ないコストで、Python プログラムの実行時間に 関する統計を得られる方法となっているのです。

呼出し回数はコード中のバグ発見にも使用できます(とんでもない数の呼出し がおこなわれている部分)。インライン拡張の対象とすべき部分を見つけるた めにも使えます(呼出し頻度の高い部分)。内部時間の統計は、注意深く最適化 すべき``ホット・ループ''の発見にも役立ちます。累積時間の統計は、アルゴ リズム選択に関連した高レベルのエラー検知に役立ちます。なお、このプロファ イラは再帰的なアルゴリズム実装の累計時間を計ることが可能で、通常のルー プを使った実装と直接比較することもできるようになっています。