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

时间:2018-05-24 11:46:06

标签: python recursion stack-overflow

我在互联网上阅读类似的问题,但没有一个答案可以帮助我。我有一个函数,对于每一行数据(数据大约有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。

2 个答案:

答案 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()方法的库,因此请求可能溢出或其他原因。