Python的sys
模块提供了一个函数setrecursionlimit
,可以让您更改Python的最大递归深度限制。文档中说:
最高可能限制取决于平台。
我的问题是:在CPython下,各个平台的最高可能限制是多少?我想知道Linux、Mac和Windows的值。
更新:我们能否避免“你做错了”的答案?我知道尝试进行非常深的递归通常不是一个好主意。我已经考虑了在我具体情况下的利弊,并决定要这样做。
在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将完全崩溃。在CPython中不应过度使用递归调用。它没有尾部优化,函数调用占用了大量内存和处理时间。这些限制可能不适用于其他实现,这并不是蓝图计划。
在CPython中,递归对于遍历数据结构很好(其中1000个限制对于所有人都足够),但对于算法不是很好。如果我要实现与图相关的算法并达到递归限制,我会实现自己的堆栈并使用迭代,或者在手动提高限制之前搜索以C/C++/任何语言实现的库。
=P
- Xavier Ho
resource.setrlimit
进行操作:https://dev59.com/6G445IYBdhLWcg3wDWCc - Ciro Santilli OurBigBook.com