Python的sys
模块provides a function setrecursionlimit
,可让您更改Python的最大递归限制。文档说:
可能的最高限制取决于平台。
我的问题是:在CPython下,各种平台的最高限制是多少?我想知道Linux,Mac和Windows的值。
更新:我们可以避免“你做错了”的答案吗?我知道尝试进行非常深度的递归通常是一个坏主意。我已经考虑了我的具体情况的利弊,并决定我想这样做。
答案 0 :(得分:31)
在Windows上(至少),sys.setrecursionlimit
不是完整的故事。硬限制是基于每个线程的,您需要调用threading.stack_size
并在达到特定限制后创建新线程。 (我认为1MB,但不确定)我已经使用这种方法将其增加到64MB堆栈。
import sys
import threading
threading.stack_size(67108864) # 64MB stack
sys.setrecursionlimit(2 ** 20) # something real big
# you actually hit the 64MB limit first
# going by other answers, could just use 2**32-1
# only new threads get the redefined stack size
thread = threading.Thread(target=main)
thread.start()
我没有试过看threading.stack_size
可能有什么限制,但可以随意尝试......这就是你需要看的地方。
总之,sys.setrecursionlimit
只是解释器本身强制执行的限制。 threading.stack_size
允许您操纵操作系统施加的实际限制。如果你先达到后一个限制,那么Python就会完全崩溃。
答案 1 :(得分:5)
主要操作系统的默认值;
答案 2 :(得分:2)
你不应该过度使用CPython中的递归调用。它没有尾部优化,函数调用使用了大量的内存和处理时间。这些限制可能不适用于其他实现,它不在蓝图中。
在CPython中,递归适用于遍历数据结构(对于每个人来说,1000的限制应该足够)但不适用于算法。如果我要实现,比如图形相关的算法并达到递归限制,我会实现自己的堆栈并使用迭代,或者在手动提高限制之前查找用C / C ++ /中实现的库。