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

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

这不也取决于你有多少内存等等吗?? 可能相当于“os 上最大可能的 setrlimit 堆栈大小是多少”。对于 Linux,我敢打赌你几乎所有的用户级 RAM,但我不知道。可以使用resource.setrlimit 操作值:***.com/questions/5061582/… 【参考方案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

以上是关于Linux、Mac 和 Windows 的硬递归限制是多少?的主要内容,如果未能解决你的问题,请参考以下文章

Mac 和 Linux 上的文本文件中的递归搜索和替换

写给小白看的硬核递归(低调点,当回小白)

linux命令 cp 递归复制和带权限复制

linux中的硬连接和软连接

linux/mac系统的软链接文件与硬链接文件

linux 文件删除