致命的 Python 错误:无法从堆栈溢出中恢复

mik*_*iki 14 python stack-overflow recursion

我在互联网上阅读了类似的问题,但没有一个答案可以帮助我。我有一个函数,可以为每一行数据(数据大约有 2'000'000 行)做一些事情,然后根据它所做的事情用不同的参数调用相同的函数。问题是,过了一会儿,我在终端中收到此错误:“致命的 Python 错误:无法从堆栈溢出中恢复。”

看起来导致这个错误最常见的错误是无限循环,但我控制并没有无限循环。因此,对我来说,'sys.getrecursionlimit()' 设置为 3000 的问题,这意味着在 3000 次调用同一函数后,它会给我错误。

首先,我不明白“致命的 Python 错误:无法从堆栈溢出中恢复”之间的区别。在终端中,或在 jupyternotebook 中出现“RecursionError:比较时超出最大递归深度”。事实上,对我来说它可能来自同样的错误(例如无限循环)。

当用一个简单的名为“test_”的函数替换我的函数时,我有以下代码:

import sys
print(sys.getrecursionlimit())

def test_(x,t):
    x = x+1
    if x<t:
        test_(x=x,t=t)

print(test_(0,2971)) # output: None
print(test_(0,2972)) # RecursionError: maximum recursion depth exceeded in comparison
Run Code Online (Sandbox Code Playgroud)

3000

没有任何

-------------------------------------------------- ------------------------- RecursionError Traceback (最近调用 last) in () 8 9 print(test_(0,2971)) --- > 10 打印(test_(0,2972))

在 test_(x, t) 5 x = x+1 6 if x 7 test_(x=x,t=t) 8 9 打印(test_(0,2971))

... 重复最后 1 帧,从下面的帧开始...

在 test_(x, t) 5 x = x+1 6 if x 7 test_(x=x,t=t) 8 9 打印(test_(0,2971))

RecursionError:相比之下超出了最大递归深度

为了克服这个问题,我在不失去“运行连续性”的情况下调整了该功能,以便我可以使用批处理:

for i in np.arange(0,9000,2000):
    test_(i,i+2000)
Run Code Online (Sandbox Code Playgroud)

有人会有更好的解决方案吗?此外,一般来说,当我们知道我们有很多迭代要做时,执行递归函数是一个坏主意?还有谁知道我如何在每个循环中打印 recursiondeepth ?

我正在使用 jupyter notebook 在带有 anaconda 的 python 3.6 上开发 Linux 虚拟环境。

小智 4

请检查这个问题(它对我有用): 如何获取Python解释器堆栈的当前深度?

您的代码基于该答案:

import sys
import inspect
print(sys.getrecursionlimit())

def test_(x, t):
    print(len(inspect.stack()))
    x = x + 1
    if x < t:
        test_(x=x, t=t)

print(test_(0, 7))
Run Code Online (Sandbox Code Playgroud)

输出:

22
23
24
25
26
27
28
None
Run Code Online (Sandbox Code Playgroud)