【发布时间】: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