プロファイリングとトレース¶
Python インタプリタは、プロファイル: 分析 (profile) や実行のトレース: 追跡 (trace) といった機能を組み込むために低水準のサポートを提供しています。このサポートは、プロファイルやデバッグ、適用範囲分析 (coverage analysis) ツールなどに使われます。
この C インターフェースは、プロファイルやトレース作業時に、Python レベルの呼び出し可能オブジェクトが呼び出されることによるオーバヘッドを避け、直接 C 関数呼び出しが行えるようにしています。プロファイルやトレース機能の本質的な特性は変わっていません; インターフェースではトレース関数をスレッドごとにインストールでき、トレース関数に報告される基本イベント (basic event) は以前のバージョンにおいて Python レベルのトレース関数で報告されていたものと同じです。
-
typedef int (*Py_tracefunc)(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)¶
PyEval_SetProfile()とPyEval_SetTrace()で登録するトレース関数の型です。 第 1 引数は登録関数にobjとして渡したオブジェクト、frameはイベントの対象のフレームオブジェクトです。whatは定数PyTrace_CALL、PyTrace_EXCEPTION、PyTrace_LINE、PyTrace_RETURN、PyTrace_C_CALL、PyTrace_C_EXCEPTION、PyTrace_C_RETURN、PyTrace_OPCODEのいずれかで、argはwhatの値によって異なります。what の値
arg の意味
常に
Py_None。sys.exc_info()の返す例外情報です。常に
Py_None。呼び出し側に返される予定の値か、例外によって関数を抜ける場合は
NULLです。呼び出される関数オブジェクト。
呼び出される関数オブジェクト。
呼び出される関数オブジェクト。
常に
Py_None。
-
int PyTrace_CALL¶
関数やメソッドの新たな呼び出し、またはジェネレータへの新たな進入を報告するときに、
Py_tracefunc関数のwhat引数に渡される値です。 ジェネレータ関数からイテレータを作成する時点では、対応するフレーム内の Python バイトコードに制御が移らないため、このイベントは報告されません。
-
int PyTrace_EXCEPTION¶
例外が送出されたときに
Py_tracefunc関数のwhat引数に渡される値です。 バイトコードの処理後に実行中のフレーム内で例外が設定されると、この値をwhatに指定してコールバックが呼び出されます。 このため、例外の伝播によって Python のスタックが巻き戻される際には、伝播先の各フレームに戻るたびにコールバックが呼び出されます。 このイベントを受け取るのはトレース関数だけで、プロファイラには不要です。
-
int PyTrace_LINE¶
行番号のイベントを報告するときに、
Py_tracefunc関数 (プロファイリング関数を除く) のwhat引数に渡される値です。 フレームのf_trace_linesを 0 に設定すると、そのフレームでは無効にできます。
-
int PyTrace_RETURN¶
呼び出しが返るときに
Py_tracefunc関数に what 引数として渡す値です。
-
int PyTrace_C_CALL¶
C関数を呼び出す直前に
Py_tracefunc関数の what 引数として渡す値です。
-
int PyTrace_C_EXCEPTION¶
C関数が例外を送出したときに
Py_tracefunc関数の what 引数として渡す値です。
-
int PyTrace_C_RETURN¶
C関数から戻るときに
Py_tracefunc関数の what 引数として渡す値です。
-
int PyTrace_OPCODE¶
新しいオペコードを実行しようとするときに、
Py_tracefunc関数 (プロファイリング関数を除く) のwhat引数に渡される値です。 このイベントはデフォルトでは発生しません。 フレームのf_trace_opcodesを 1 に設定して明示的に要求する必要があります。
-
void PyEval_SetProfile(Py_tracefunc func, PyObject *obj)¶
プロファイラ関数を
funcに設定します。objはその関数の第 1 引数として渡され、任意の Python オブジェクトまたはNULLを指定できます。 プロファイラ関数が状態を保持する必要がある場合は、スレッドごとに異なるobjを使うと、便利でスレッドセーフな保存先になります。 プロファイラ関数はPyTrace_LINE、PyTrace_OPCODE、PyTrace_EXCEPTIONを除くすべての監視対象イベントについて呼び出されます。sys.setprofile()関数も参照してください。呼び出し元には アタッチされたスレッド状態 が必要です。
-
void PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *obj)¶
PyEval_SetProfile()と同様ですが、現在のスレッドだけでなく、現在のインタープリタに属する実行中のすべてのスレッドにプロファイラ関数を設定します。呼び出し元には アタッチされたスレッド状態 が必要です。
PyEval_SetProfile()と同様に、すべてのスレッドにプロファイラ関数を設定する際に発生した例外を無視します。
Added in version 3.12.
-
void PyEval_SetTrace(Py_tracefunc func, PyObject *obj)¶
トレース関数を
funcに設定します。PyEval_SetProfile()と同様ですが、トレース関数は行番号のイベントとオペコードごとのイベントを受け取り、C 関数オブジェクトの呼び出しに関連するイベントは受け取りません。PyEval_SetTrace()で登録したトレース関数には、what引数としてPyTrace_C_CALL、PyTrace_C_EXCEPTION、PyTrace_C_RETURNが渡されることはありません。sys.settrace()関数も参照してください。呼び出し元には アタッチされたスレッド状態 が必要です。
-
void PyEval_SetTraceAllThreads(Py_tracefunc func, PyObject *obj)¶
PyEval_SetTrace()と同様ですが、現在のスレッドだけでなく、現在のインタープリタに属する実行中のすべてのスレッドにトレース関数を設定します。呼び出し元には アタッチされたスレッド状態 が必要です。
PyEval_SetTrace()と同様に、すべてのスレッドにトレース関数を設定する際に発生した例外を無視します。
Added in version 3.12.
参照のトレース¶
Added in version 3.13.
-
typedef int (*PyRefTracer)(PyObject*, int event, void *data)¶
PyRefTracer_SetTracer()で登録するトレース関数の型です。 第 1 引数は、作成されたばかりの Python オブジェクト (eventがPyRefTracer_CREATEの場合)、またはこれから破棄されるオブジェクト (eventがPyRefTracer_DESTROYの場合) です。data引数はPyRefTracer_SetTracer()の呼び出し時に渡した不透明なポインタです。現在のトレース関数を置き換える新しい関数が登録される場合、新しい関数の登録直前に、オブジェクトを
NULL、eventをPyRefTracer_TRACKER_REMOVEDとして現在のトレース関数が呼び出されます。
Added in version 3.13.
-
int PyRefTracer_CREATE¶
Python オブジェクトが作成されたときに、
PyRefTracer関数のevent引数に渡される値です。
-
int PyRefTracer_DESTROY¶
The value for the event parameter to
PyRefTracerfunctions when a Python object has been destroyed.
-
int PyRefTracer_TRACKER_REMOVED¶
現在のトレーサが新しいトレーサに置き換えられる直前に、
PyRefTracer関数のevent引数に渡される値です。Added in version 3.14.
-
int PyRefTracer_SetTracer(PyRefTracer tracer, void *data)¶
参照トレーサ関数を登録します。 この関数は、Python オブジェクトが新しく作成されたときと、これから破棄されるときに呼び出されます。
dataを指定する場合は不透明なポインタでなければならず、トレーサ関数の呼び出し時に渡されます。 成功した場合は0を返します。 エラーの場合は例外を設定して-1を返します。トレーサ関数の内部では Python オブジェクトを作成しては いけません。 作成すると、トレーサ関数が再入されてしまいます。 また、既存の例外をクリアしたり、新しい例外を設定したりしては いけません。 トレーサ関数が呼び出されるときは、常に スレッド状態 が有効です。
この関数の呼び出し時には スレッド状態がアタッチされている 必要があります。
別のトレーサ関数がすでに登録されている場合、新しい関数の登録直前に、
eventをPyRefTracer_TRACKER_REMOVEDとして古い関数が呼び出されます。
Added in version 3.13.
-
PyRefTracer PyRefTracer_GetTracer(void **data)¶
登録された参照トレーサ関数と、
PyRefTracer_SetTracer()の呼び出し時に登録された不透明なデータポインタの値を取得します。 トレーサが登録されていない場合は NULL を返し、dataポインタを NULL に設定します。この関数の呼び出し時には スレッド状態がアタッチされている 必要があります。
Added in version 3.13.
パフォーマンス統計¶
-
PYSTATS_MAX_UOP_ID¶
CPython がパフォーマンス統計用カウンタを割り当てるマイクロ命令の識別子の最大値。
--enable-pystatsで構成したビルドでのみ利用できます。この定数は内部専用で、拡張モジュールには役立ちません。
バージョン 3.15.2 で ソフト非推奨 <Soft deprecated>.