减少执行帧的堆栈跟踪

问题描述 投票:0回答:1

我正在尽我所能在这里不要模糊,这一切都可以通过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个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.