【发布时间】:2014-08-13 22:47:06
【问题描述】:
作为实验的一部分,我在 python 中编写了一个 verilog(基本上是逻辑门及其连接描述)模拟器。
我遇到了堆栈限制的问题,所以我做了一些阅读,发现 Python 没有“尾调用优化”功能(即在递归进行时动态删除堆栈条目)
这方面我主要有两个问题:
1) 如果我将堆栈限制提高到sys.setrecursionlimit(15000),它会在时间方面影响性能吗(内存——我不在乎)?
2) 假设我可以在没有堆栈跟踪的情况下生活,有什么办法可以绕过这个限制。
我问这个是因为 Verilog 主要处理可以使用递归函数以优雅的方式实现的状态机。
另外,如果我可以添加,在递归函数调用的情况下,如果存在错误,我会更多地依赖导致此错误的输入而不是堆栈跟踪。
我是 Python 新手,所以专家们可能会争辩说 Python 堆栈跟踪对于调试递归函数调用非常有用……如果是这样的话,我会非常乐意学习如何做到这一点。
最后,是否建议用 Python 编写递归函数,还是应该转向其他语言?
如果有任何解决方法可以让我继续使用 python 进行递归函数,我想知道是否有任何性能影响(不过我可以进行分析)。
【问题讨论】:
-
我不知道它在理论上如何影响性能,但我从来没有遇到过重大问题,并且总是将
sys.setrecursionlimit设置为最大可能值,因为我遇到了大型类/函数的问题默认的最大递归深度。也就是说,正如下面的答案所解释的那样,除了一长串的递归调用之外,大多数时候有一种更快的方法来做你正在做的任何事情。 -
如果可以做尾调用优化,那么就不需要栈来模拟递归了。将其转换为仅使用常规无堆栈循环将是微不足道的。