【问题标题】:Reduce stacktrace of executing frame减少执行帧的堆栈跟踪
【发布时间】:2019-02-19 16:55:58
【问题描述】:

我正在尽我最大的努力不要在这里含糊其辞,这一切都可以通过 while 循环来解决,但作为一个练习,我已经违背了使用 while 循环的最佳实践,希望能学到新的东西。

我正在重新学习 CPU 架构的一些基础知识,并认为使用“实际”JMP 逻辑或在软件中尽可能接近它来实现 CPU 仿真会是一个有趣的项目。

但是,我陷入了上述逻辑的渲染过程中。 代码是(根据我的最佳判断)与问题无关但为了避免一回一四,逻辑如下:

.LDA 0220
.ASL
.BCC FA

所有这一切都会检查一个寄存器,如果状态标志设置正确,则向左执行位移并跳转到内存地址FA,否则它将跳转回.LDA并再次检查寄存器。

python 中的实现与代码中每个步骤的递归函数相同。不用说,这超出了最佳实践,但我认为这将是一个有趣的递归和调用顺序实验。

如果我的数学检查出来了,我会在 python 停止之前得到 16 280 个递归调用,并在 3 秒左右后退出到命令提示符。

我已经完成了sys.setrecursionlimit(self.dotcount*self.linecount) 增加递归限制的肮脏尝试,这里的目标是能够执行 81 600 次递归(340x240 像素,每像素一次递归调用粗略) .

根据What is the maximum recursion depth in Python, and how to increase it?,这是个坏主意,因为框架很大,所以我尝试解决这个问题:

for tb in inspect.stack():
    tb.frame.clear()

我也尝试过(没有成功)使用traceback.clear_frames(tb)
死胡同用RuntimeError: cannot clear an executing frame 击中了我。

我最后的手段/问题是:是否可以减少执行帧以允许更多递归调用,我知道这些调用会有一个美好的结局?我什至看不到我的 RAM 快用完了,应用程序的运行速度甚至没有明显变慢 (我预计会在某个时候变慢)

如果是这样,我该如何释放堆栈跟踪或进一步增加递归深度?

【问题讨论】:

    标签: python python-3.x stack stack-trace


    【解决方案1】:

    所以 Python 本身并没有直接进行尾递归的机制。但是,有一些有趣的tail-recursion decorators 应该会有所帮助。它们通过在再次进入递归调用之前编辑调用堆栈来工作。很聪明!

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 2011-05-25
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2021-12-06
      相关资源
      最近更新 更多