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