python - 如何知道可以为 Python 3 中的平台设置的最大递归深度?

标签 python python-3.x algorithm recursion sys

我正在实现深度优先搜索算法,以获取具有大量节点(超过 800,000 个)的图的强连通分量。

运行时出现如下错误:

RecursionError: maximum recursion depth exceeded in comparison

为了解决这个问题,我使用了 sys.setrecursionlimit(numNodes) 的帮助功能。 执行此操作时,IDLE 开始执行代码,但随后自动重新启动而不提供任何输出。

基于快速网络搜索(example),我认为这是因为在递归这么多节点时 IDLE 超出了内存限制。

对于 numNodes = 20000,sys.setrecursionlimit(3000) 可以解决问题

对于 numNodes = 40000,sys.setrecursionlimit(5000) 可以解决问题

对于 numNodes = 80000,sys.setrecursionlimit(5000) 重新启动 IDLE。 (这里注意,它不显示 RecursionError,只是重启 IDLE)

疑问:我可以为我的平台设置的 sys.setrecursionlimit(limit)limit 的最大值是多少?

更新:关于堆栈溢出的其他类似问题询问如何更改值或最大递归深度是多少。我需要了解“限制”的最大可能值是多少。 sys.getrecursionlimit() 会给我当前设置的任何“限制”。

最佳答案

您已经找到问题的答案,但对于如何绕过递归限制仍然没有答案。

简单的方法是维护自己的堆栈。对于深度优先,可以这样做。

todo = [starting, stuff]
while 0 < len(todo):
    task = todo.pop()
    do work
    todo.extend(future_tasks)

在这种形式下,从DFS切换到BFS需要从栈切换到队列。这在 Python 中很简单:

todo = [starting, stuff]
while 0 < len(todo):
    task = todo.pop(0)  # CHANGED HERE
    do work
    todo.extend(future_tasks)

关于python - 如何知道可以为 Python 3 中的平台设置的最大递归深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57363426/

相关文章:

python - 将 Python 列表元素映射到多个元素,避免嵌套列表

python - 如何在Python中从现有的父类(super class)类型对象实例化子类类型变量

python - 使用递归的线性划分

algorithm - 邻居数KNN算法

java - 为什么这个 Szudzik Elegant Pairing 给出了错误的结果?

python - 使用 python 通过 TLS 发送电子邮件

python - Keras 中的自定义损失函数仅运行一次

python - 如何访问 gensim word2vec 中的输出嵌入(输出向量)?

python-3.x - Python 3 文件共享变量

python - "Caching"字符串 : why has no effect?