2017-01-05 6 views
1

私たちは、cライブラリを使っていくつかの低レベル関数を呼び出すpythonスクリプトを持っています。 コード構造上の理由から、各c呼び出しの前にスタックトレース/呼び出しスタックを格納する必要があります。我々は、Pythonのコールスタックを抽出するためにtraceback.extract_stack()を使用してこれを行うにはpythonトレースバック - パフォーマンスの問題

。 後で例外が発生すると、各要素にtraceback.format_list(abc)を使用して、スタックトレースの書式設定と印刷を行います。

問題は機能extract_stackが遅すぎるということです。コードを1.7秒から11秒に遅くします。

後で/印刷、それを使用できるようにするために、スタックトレースを格納するための任意の関数はありますか? stacktraceゲッターは非常に高速でなければなりません。フォーマット機能が遅くなることがありますが、これは問題ありません。

例:

Stack Trace: 
    - LXScript: '_LXS:TOOL:RUNLX' 
     File "_LXS:TOOL:RUNLX", line 13, in <module> 
     File "lxs", line 1, in <module> 
    - UNIFACE ACTIVATE: 'ACTQREC_SVC' 'EXECLXSRP' 
    - LXScript: '_DATATRT:ACTQREC:[email protected]:run' 
     File "_LXS:TOOL:RUNLX", line 13, in <module> 
     File "lxs", line 1, in <module> 
     File "<string>", line 63, in run 
     File "<string>", line 97, in __doAll 
     File "<string>", line 127, in __do 
     File "_DATATRT:ACTQREC:EXECUTE", line 7, in do 
    - UNIFACE ACTIVATE: 'ACTQ_CSVC' 'EXECBYREC' 
    - LXScript: 'TOOL:ACTQ:[email protected]:runOnBeforeExec' 
     File "TOOL:ACTQ:SYNLAB_DATA", line 1, in <module> 
    ImportError: No module named 'localls' 
+1

はなぜ例外の後にスタックトレースを取得していないので、オーバーヘッドは唯一の例外的な状況にありますか? –

+0

おそらく、コンテキストの一部だけを取得するために 'limit'パラメータを使うことができます。上記の例では、すべてのスタックが必要なわけではなく、より深い5つの呼び出ししか必要としないかもしれません。操作を少しスピードアップする必要があります。私たちは非Pythonコード(UNIFACE)からCインタフェースを入力するときに我々はexsitingスタックトレースを持っていないので –

+0

は を@PeterWood。 –

答えて

1

私はこの問題を解決!

我々が得るためにstt_obj = sys._getframe().f_backを使用することができます "<frame>の?"そして、estt_obj = traceback.extract_stack(f=stt_obj)traceback.format_list(estt_obj)を使用して、スタックトレースを文字列リストとして取得できます。

+0

'elem'と' self'が 'STT_OBJ'を読むためにどこに存在するかを表示できますか? – Glycerine

+1

私は自分の答えを編集しました@グリセリン –

+0

本当にありがとう - これは本当に動作します、 'f'はフレームです!それがドキュメントではっきりしていたら – Glycerine