【问题标题】:What is the hard recursion limit for Linux, Mac and Windows?Linux、Mac 和 Windows 的硬递归限制是多少?
【发布时间】:2011-02-24 10:09:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这不也取决于你有多少内存等等吗??
  • 可能相当于“{os} 上最大可能的 setrlimit 堆栈大小是多少”。对于 Linux,我敢打赌你几乎所有的用户级 RAM,但我不知道。可以使用resource.setrlimit 操作值:stackoverflow.com/questions/5061582/…

标签: python recursion platform


【解决方案1】:

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

【讨论】:

  • 如果我没有 'main' 对象,我应该用什么代替 'target=main'?
  • 你把任何函数名放在那里。它不必被称为 main。
  • 我设置为堆栈大小的任何值都无法解决我的递归限制问题。我知道我需要的真正递归深度在 100k 以下,我设法在 Linux 下运行它,但在 Windows 下不行。
  • 在 Windows 10 创意者更新版本上非常适合我。我可以通过这种方式将堆栈大小增加到 2^28-1 字节(或 256 MB);不确定默认值是什么,但肯定比这少得多。为什么不超过 256MB?也许某些 Windows 限制?
  • 在 macOS 10.14.5 上存在同样的问题,只有这个解决方案有效!谢谢你拯救了我该死的一天!
【解决方案2】:

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

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

【讨论】:

  • 感谢您提供的信息,但这更像是一个有见地的评论而不是答案。 (作为答案,它属于“你做错了”类型。)
  • 谢谢@Xavier。事实上,在这个职业中,我从别人那里学到的几乎所有东西都是“你做错了”的阴影。
  • 我完全同意你的看法。你不需要递归。你不需要堆栈限制。如果您导致堆栈溢出,那么您做错了。 =P
猜你喜欢
  • 2017-07-23
  • 2011-02-17
  • 2012-05-01
  • 2016-07-04
  • 2016-03-02
  • 2014-09-17
  • 2015-09-19
  • 2012-10-08
相关资源
最近更新 更多