35

Python 的sys模块提供了一个函数 setrecursionlimit,可以让您更改 Python 的最大递归限制。文档说:

可能的最高限制取决于平台。

我的问题是:在 CPython 下,各种平台的最高可能限制是多少?我想知道 Linux、Mac 和 Windows 的值。

更新:我们可以避免“你做错了”的答案吗?我知道尝试进行非常深的递归通常是一个坏主意。我已经考虑了我具体情况的利弊,并决定我想这样做。

4

2 回答 2

35

在 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 将完全崩溃。

于 2010-05-27T02:30:14.030 回答
2

你不应该在 CPython 中过度使用递归调用。它没有尾部优化,函数调用占用大量内存和处理时间。这些限制可能不适用于其他实现,它不在蓝图中。

在 CPython 中,递归适用于遍历数据结构(对于每个人来说,1000 的限制应该足够了),但不适用于算法。例如,如果我要实现图形相关算法并达到递归限制,我要么实现自己的堆栈并使用迭代,要么在手动提高限制之前寻找用 C/C++/其他方式实现的库。

于 2010-05-26T22:27:54.300 回答