Python:Linux,Mac和Windows的硬递归限制是多少?

Ram*_*hum 31 python recursion platform

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

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

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

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

Fog*_*ird 33

在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()
Run Code Online (Sandbox Code Playgroud)

我没有试图看到可能存在的限制threading.stack_size,但可以随意尝试......这就是你需要看的地方.

总之,sys.setrecursionlimit这只是解释器本身强制执行的限制. threading.stack_size让您操纵操作系统施加的实际限制.如果你首先达到后一个限制,Python将完全崩溃.


Mar*_*ani 3

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

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

  • 感谢您提供的信息,但这更多的是富有洞察力的评论,而不是答案。(作为答案,它属于“你做错了”类型。) (13认同)