Python プログラムのプロファイリングを行って、なぜ遅いように見えるのかを確認しました。その実行時間の大部分がinspect.stack()
メソッド (モジュールと行番号を含むデバッグ メッセージを出力するため) に費やされ、呼び出しごとに 0.005 秒であることがわかりました。これはかなり高いようです。本当にこれはinspect.stack
遅いですか、それとも私のプログラムに何か問題があるのでしょうか?
2 に答える
inspect.stack()
次の 2 つのことを行います。
呼び出し元からのスタック フレームをインタプリタに要求してスタックを収集し (
sys._getframe(1)
)、すべての.f_back
参照に従います。これは安いです。フレームごとに、ファイル名、行番号、およびソース ファイルのコンテキスト (ソース ファイルの行と、必要に応じてその周りの余分な行) を収集します。後者は、スタック フレームごとにソース ファイルを読み取る必要があります。これは高価なステップです。
ファイル コンテキストの読み込みをオフにするには、context
パラメータを0
次のように設定します。
inspect.stack(0)
コンテキストが 0 に設定されていても、フレームごとにファイル名が決定され、存在することが確認されるため、フレームごとにいくらかのファイルシステム アクセスが発生します。
inspect.stack(0)
より速くすることができますinspect.stack()
。それでも、それを完全に呼び出すのを避け、代わりに次のようなパターンを使用するのが最速です。
frame = inspect.currentframe()
while frame:
if has_what_i_want(frame): # customize
return what_i_want(frame) # customize
frame = frame.f_back
frame.f_back
最後が None
であり、ループが終了することに注意してください。
sys._getframe(1)
内部メソッドであるため、明らかに使用しないでください。
別の方法としてinspect.getouterframes(inspect.currentframe())
ループオーバーすることもできますが、これは上記のアプローチよりも遅くなることが予想されます。