【发布时间】:2018-11-03 15:17:02
【问题描述】:
我在互联网上阅读了类似的问题,但没有一个答案可以帮助我。我有一个函数,它为每一行数据(数据大约有 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
3000
无
----------------------------------- ---------------------------- RecursionError Traceback(最近一次调用 最后)在() 8 9 打印(测试_(0,2971)) ---> 10 次打印(test_(0,2972))
在 test_(x, t) 5 x = x+1 6 如果 x 7 测试_(x=x,t=t) 8 9 打印(test_(0,2971))
...最后一帧重复,从下面的帧开始...
在 test_(x, t) 5 x = x+1 6 如果 x 7 测试_(x=x,t=t) 8 9 打印(test_(0,2971))
RecursionError:比较中超出了最大递归深度
为了克服这个问题,我在不失去“运行连续性”的情况下调整了函数,以便我可以使用批处理:
for i in np.arange(0,9000,2000):
test_(i,i+2000)
有人有更好的解决方案吗?另外,一般来说,当我们知道我们有很多迭代要做时,做递归函数是个坏主意?还有谁知道我如何在每个循环中打印递归深度?
我正在使用带有 anaconda 的 python 3.6 使用 jupyter notebook 开发 Linux 虚拟环境。
【问题讨论】:
-
你能不能从你的函数返回当前状态,让调用者再次调用它?这样你就不会耗尽堆栈。
-
@miki,我用批处理方法测试了你的代码,它对我有用。也许你运行 for 循环的递归限制不同?
-
感谢乔纳森的回答。我会试试这个,但我们确定错误来自以“嵌入”方式多次调用函数吗?因为,如果是这种情况,那么“批量更正”应该已经更正了错误,不是吗?
-
谢谢@Elad!是的,它也对我有用,但就我的真实函数(而不是这个测试函数)而言,我不断收到错误......所以这就是为什么我想在每次迭代时打印递归深度以更好地理解它。
标签: python recursion stack-overflow