9

Python プログラムのプロファイリングを行って、なぜ遅いように見えるのかを確認しました。その実行時間の大部分がinspect.stack()メソッド (モジュールと行番号を含むデバッグ メッセージを出力するため) に費やされ、呼び出しごとに 0.005 秒であることがわかりました。これはかなり高いようです。本当にこれはinspect.stack遅いですか、それとも私のプログラムに何か問題があるのでしょうか?

4

2 に答える 2

20

inspect.stack()次の 2 つのことを行います。

  • 呼び出し元からのスタック フレームをインタプリタに要求してスタックを収集し ( sys._getframe(1))、すべての.f_back参照に従います。これは安いです。

  • フレームごとに、ファイル名、行番号、およびソース ファイルのコンテキスト (ソース ファイルの行と、必要に応じてその周りの余分な行) を収集します。後者は、スタック フレームごとにソース ファイルを読み取る必要があります。これは高価なステップです。

ファイル コンテキストの読み込みをオフにするには、contextパラメータを0次のように設定します。

inspect.stack(0)

コンテキストが 0 に設定されていてもフレームごとにファイル名が決定され、存在することが確認されるため、フレームごとにいくらかのファイルシステム アクセスが発生します。

于 2013-07-01T14:45:41.143 に答える
17

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())ループオーバーすることもできますが、これは上記のアプローチよりも遅くなることが予想されます。

于 2017-03-06T21:50:24.870 に答える