我們有一個使用c庫調用一些低級函數的python腳本。 由於代碼結構的原因,我們希望在每次c調用之前存儲堆棧跟蹤/調用堆棧。python traceback - 性能問題
爲此,我們使用traceback.extract_stack()
來提取python的調用堆棧。 當稍後發生異常時,我們在每個元素上使用traceback.format_list(abc)
來格式化和打印堆棧跟蹤。
問題是功能extract_stack
太慢了。我將代碼從1.7秒減慢到11秒。
是否有任何函數來存儲堆棧跟蹤,以便以後能夠使用/打印? stacktrace getter必須非常快。格式化功能可以很慢,這是沒有問題的。
例子:
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個更深的調用。應該加快一點操作。 –
@PeterWood 因爲當我們從非python代碼(uniface)進入c接口時,我們沒有現有的stacktrace。 –