Linux、Mac和Windows的硬递归限制是多少?

37 投票
2 回答
13151 浏览
提问于 2025-04-15 23:13

Python的sys模块里有一个功能叫setrecursionlimit,这个功能可以让你改变Python的最大递归限制。文档中提到:

最高的限制是和平台有关的。

我想问的是:在CPython下,各个平台的最高限制是多少?我想知道Linux、Mac和Windows的具体数值。

更新:能不能不要给我“你这样做是不对的”的回答?我知道深度递归通常不是个好主意。我已经在我的具体情况下考虑过利弊,决定还是想这么做。

2 个回答

3

在CPython中,不要过度使用递归调用。因为它没有尾递归优化,函数调用会消耗很多内存和处理时间。这些限制可能在其他实现中不存在,但在CPython的设计中是这样的。

在CPython中,递归适合用来遍历数据结构(通常1000次的限制对大多数人来说已经足够了),但不适合用在算法上。如果我想实现一些与图相关的算法,结果碰到了递归限制,我会选择自己实现一个栈,使用循环来代替,或者在提高限制之前,先寻找一些用C/C++等语言实现的库。

36

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

撰写回答