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)
| 归档时间: |
|
| 查看次数: |
19022 次 |
| 最近记录: |