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

时间:2010-05-26 22:12:42

标签: python recursion platform

Python的sys模块provides a function setrecursionlimit,可让您更改Python的最大递归限制。文档说:

  

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

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

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

3 个答案:

答案 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)

主要操作系统的默认值;

  • 适用于Windows:2000
  • 对于Linux:1000
  • 适用于Mac OS:1000

答案 2 :(得分:2)

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

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

相关问题