确定Python的最大有效setrecursionlimit值

Cha*_*ino 5 python recursion

在Python 2文档中,sys库包含以下内容(粗体部分是我的编辑):

sys.setrecursionlimit(limit)

将Python解释器堆栈的最大深度设置为limit。此限制可防止无限递归导致C堆栈溢出和Python崩溃。

可能的最高限制取决于平台。当用户拥有需要深度递归的程序和支持更高限制的平台时,用户可能需要将限制设置为更高。这应该小心进行,因为过高的限制可能导致崩溃。

这是什么意思?这仅仅是一般的“确保您有足够的内存来处理额外的堆栈空间”语句,还是有特定的“每堆栈帧”大小可用于计算所需的内存值?当无法获取空间时,Python会发生什么?

Way*_*ner 3

为什么让我们来了解一下:

me@host$ docker run -m 4MB --cpuset-cpus=0 -it --rm python:3.5.1
Python 3.5.1 (default, Dec  9 2015, 00:12:22)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, struct
>>> maxint = 2 ** (struct.Struct('i').size * 8 - 1) - 1
>>> sys.setrecursionlimit(maxint)
>>> def goodbye_world():
...  goodbye_world()
...
>>> goodbye_world()
me@host$
Run Code Online (Sandbox Code Playgroud)

韦尔普。看起来它使 Python 崩溃了。当你只给它 4MB RAM 时,速度也很快。

  • @MikeWilliamson,自从我写这个答案以来才几年,所以我不太记得为什么我使用这个值,但我*认为*这是因为这是该架构的最大可寻址大小(所以,一个 64 位数字对于 64 位系统)。我绝对不是在暗示这是一个很好的递归限制(正如崩溃所证明的那样)。良好的递归限制是 1) 您的平台支持,2) 允许您执行您需要的操作。有时 1 会阻止 2。 (2认同)