关于Python递归深度限制
本文简单讨论了Python的递归深度限制及如何设置Python的递归深度。
RuntimeError异常
这段时间用Python写了一个遍历脚本,但是当遍历到900多时就会出现莫名其妙的错误,通过Eclipse调试报错:
RuntimeError: maximum recursion depth exceeded while calling a Python object
大意是调用 Python 对象时超出最大深度限制
Python的递归深度
Python语言默认的递归深度是很有限的,当递归深度超过值的时候,就会引发RuntimeError异常。
Python专门设置的一种机制用来防止无限递归造成Python溢出,这个值理论上1000,实际运行时在900多次时就会报错。
解决方法
最大递归次数是可以重新调整的。解决的方式是手工设置递归调用深度:
1
2
|
import sys sys.setrecursionlimit( 1000000 ) |
执行这个代码后,递归深度调整到1000000层,基本上够用了。
还需要使用resource模块调整缓存大小:
import resource, sys
resource.setrlimit(resource.RLIMIT_STACK(resource.RLIM_INFINITY,resource.RLIM_INFINITY))
sys.setrecursionlimit(2**20)
或者在bash中调整:(可能需要sudo)
ulimit -s 100000
stackoveflow上有说,因为python的stackframe太大…所以开不了太大的深度,至少在我的机器上只能开到20000
在mac上的Python3.6可以直接设置到最大值2**31-1,没问题。
不知道跟系统如何相关。
设置本身没有问题,但是如果用简单的递归函数测试:
def f(k):
print(k)
f(k+1)
f(0)
最大到20000左右就会Segment fault
赞👍
请问还有没有别的办法解决递归深度问题呢
把算法改成非递归?
你可以试试Haskell或者任何一门FP(逃
可以几乎无限递归(只要内存足够
万一递归深度太大,把内存给占满了怎么办……
递归深度应该占据内存不大。
哇 陈老师好赞!刚刚提问就发了出来!