【问题标题】:python traceback - performance problemspython traceback - 性能问题
【发布时间】:2017-05-19 19:13:10
【问题描述】:

我们有一个 python 脚本,它使用一个 c 库来调用一些低级函数。 由于代码结构的原因,我们希望在每次 c 调用之前存储堆栈跟踪/调用堆栈。

为此,我们使用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: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'

【问题讨论】:

  • 为什么异常后不获取堆栈跟踪,所以开销只在异常情况下?
  • 也许您可以使用limit 参数仅获取上下文的一部分。在上面的示例中,也许您不需要所有堆栈,而只需要 5 个更深的调用。应该会加快操作速度。
  • @PeterWood 因为我们从非python代码(uniface)进入c接口时没有现有的stacktrace。
  • @Jean-FrançoisFabre 我认为这仍然太慢了。
  • 通过使用 2 的限制,我得到了 2.1 秒。与 1,7 和 11 相比,它有很大的不同!

标签: python stack-trace callstack traceback


【解决方案1】:

我解决了这个问题!!!

我们可以使用stt_obj = sys._getframe().f_back 来获取“&lt;frame&gt;?”然后我们可以使用estt_obj = traceback.extract_stack(f=stt_obj)traceback.format_list(estt_obj) 来获取堆栈跟踪作为字符串列表。

【讨论】:

  • 您能否显示elemself 存在的位置以读取STT_OBJ
  • 非常感谢 - 这真的很有效,f 是一个框架!我希望在文档中更清楚
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2014-11-28
  • 2020-07-03
  • 1970-01-01
  • 2022-10-19
  • 2017-04-13
  • 2011-11-09
相关资源
最近更新 更多