我在互联网上阅读类似的问题,但没有一个答案可以帮助我。我有一个函数,对于每一行数据(数据大约有2' 000' 000行)执行某些操作,然后根据其执行的操作调用具有不同参数的相同函数。问题是,在一段时间后我在终端中收到此错误:'致命Python错误:无法从堆栈溢出中恢复。'
它接触导致此错误的最常见错误是无限循环,但我控制并且没有无限循环。因此,对我来说,问题是' sys.getrecursionlimit()'设置为3000,这意味着在3000调用相同的函数后,它会给我错误。
首先,我不明白“致命的Python错误:无法从堆栈溢出中恢复”之间的区别。'在终端中,或者一个“递归错误”:比较超过最大递归深度'在jupyternotebook。实际上,对我而言,它可能来自同样的错误(例如无限循环)。
当用名为' 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(最近一次调用 最后)in() 8 9打印(test_(0,2971)) ---&GT; 10打印(test_(0,2972))
in test_(x,t) 5 x = x + 1 6如果x 7 test_(x = x,t = t) 8 9打印(test_(0,2971))
...从下面的框架重复最后1帧...
in test_(x,t) 5 x = x + 1 6如果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)
有人会有更好的解决方案吗?另外,一般来说,当我们知道要进行大量迭代时,做递归函数是个坏主意吗?也有人知道如何在每个循环中打印recursiondeepth吗?
我正在研究一个Linux虚拟环境,使用jupyter笔记本,在python 3.6上使用anaconda。
答案 0 :(得分:2)
请检查这个问题(这对我有用): How do I get the current depth of the Python interpreter stack?
基于该答案的代码:
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))
输出:
22
23
24
25
26
27
28
None
答案 1 :(得分:0)
我的问题是在连接不良时向一些API发送请求。这是一个使用bot.polling()
方法的库,因此请求可能溢出或其他原因。