python 回溯 - 性能问题
python traceback - performance problems
我们有一个 python 脚本,它使用 c 库来调用一些低级函数。
由于代码结构原因,我们希望在每次 c 调用之前存储堆栈 trace/call 堆栈。
为此,我们使用 traceback.extract_stack()
提取 python 的调用堆栈。
当稍后发生异常时,我们在每个元素上使用 traceback.format_list(abc)
来格式化和打印堆栈跟踪。
问题是函数 extract_stack
太慢了。我将我们的代码从 1.7 秒减慢到 11 秒。
是否有任何功能可以存储堆栈跟踪以便以后能够use/print它?
堆栈跟踪 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:EXECUTE@Main: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:SYNLAB_DATA@Main:runOnBeforeExec'
File "TOOL:ACTQ:SYNLAB_DATA", line 1, in <module>
ImportError: No module named 'localls'
我解决了问题!!!
我们可以用stt_obj = sys._getframe().f_back
得到“<frame>
?”然后我们可以使用 estt_obj = traceback.extract_stack(f=stt_obj)
和 traceback.format_list(estt_obj)
将堆栈跟踪作为字符串列表获取。
我们有一个 python 脚本,它使用 c 库来调用一些低级函数。 由于代码结构原因,我们希望在每次 c 调用之前存储堆栈 trace/call 堆栈。
为此,我们使用 traceback.extract_stack()
提取 python 的调用堆栈。
当稍后发生异常时,我们在每个元素上使用 traceback.format_list(abc)
来格式化和打印堆栈跟踪。
问题是函数 extract_stack
太慢了。我将我们的代码从 1.7 秒减慢到 11 秒。
是否有任何功能可以存储堆栈跟踪以便以后能够use/print它? 堆栈跟踪 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:EXECUTE@Main: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:SYNLAB_DATA@Main:runOnBeforeExec'
File "TOOL:ACTQ:SYNLAB_DATA", line 1, in <module>
ImportError: No module named 'localls'
我解决了问题!!!
我们可以用stt_obj = sys._getframe().f_back
得到“<frame>
?”然后我们可以使用 estt_obj = traceback.extract_stack(f=stt_obj)
和 traceback.format_list(estt_obj)
将堆栈跟踪作为字符串列表获取。