python 最大递归次数 RuntimeError: maximum recursion depth exceeded
来源:互联网 发布:瞻博网络 五百强 编辑:程序博客网 时间:2024/06/14 00:53
帮别人看代码,偶然遇到这个问题,原来python解释器有一个默认的最大递归次数是999。
举个例子:
def recursion(n): if (n <= 1): return print n recursion(n - 1)print "test 999"recursion(999) #正常运行print "test 1000"recursion(1000) #报错,RuntimeError: maximum recursion depth exceeded
可以在文件初始位置修改这个最大递归次数,如下:
import syssys.setrecursionlimit(10000) # set the maximum depth as 10000
这时候递归1000次,2000次都不会报错了,但次数很大时比如5000就会报错,又查资料,结论如下:
sys.setrecursionlimit(limit)
Set the maximum depth of the Python interpreter stack to limit. This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python.
The highest possible limit is platform-dependent. A user may need to set the limit higher when she has a program that requires deep recursion and a platform that supports a higher limit. This should be done with care, because a too-high limit can lead to a crash.
sys.setrecursionlimit()
只是修改解释器在解释时允许的最大递归次数,此外,限制最大递归次数的还和操作系统有关,经过测试:
windows下最大迭代次数约4400次,linux下最大迭代次数约为24900次(python 2.7 64位)
如下代码可以测试最大迭代次数:
import sysimport itertoolsclass RecursiveBlowup1: def __init__(self): self.__init__()def test_init(): return RecursiveBlowup1()class RecursiveBlowup2: def __repr__(self): return repr(self)def test_repr(): return repr(RecursiveBlowup2())class RecursiveBlowup4: def __add__(self, x): return x + selfdef test_add(): return RecursiveBlowup4() + RecursiveBlowup4()class RecursiveBlowup5: def __getattr__(self, attr): return getattr(self, attr)def test_getattr(): return RecursiveBlowup5().attrclass RecursiveBlowup6: def __getitem__(self, item): return self[item - 2] + self[item - 1]def test_getitem(): return RecursiveBlowup6()[5]def test_recurse(): return test_recurse()def test_cpickle(_cache={}): try: import cPickle except ImportError: print "cannot import cPickle, skipped!" return l = None for n in itertools.count(): try: l = _cache[n] continue # Already tried and it works, let's save some time except KeyError: for i in range(100): l = [l] cPickle.dumps(l, protocol=-1) _cache[n] = ldef check_limit(n, test_func_name): sys.setrecursionlimit(n) if test_func_name.startswith("test_"): print test_func_name[5:] else: print test_func_name test_func = globals()[test_func_name] try: test_func() # AttributeError can be raised because of the way e.g. PyDict_GetItem() # silences all exceptions and returns NULL, which is usually interpreted # as "missing attribute". except (RuntimeError, AttributeError): pass else: print "Yikes!"limit = 1000while 1: check_limit(limit, "test_recurse") # check_limit(limit, "test_add") # check_limit(limit, "test_repr") # check_limit(limit, "test_init") # check_limit(limit, "test_getattr") # check_limit(limit, "test_getitem") # check_limit(limit, "test_cpickle") print "Limit of %d is fine" % limit limit = limit + 100
阅读全文
0 0
- python 最大递归次数 RuntimeError: maximum recursion depth exceeded
- RuntimeError: maximum recursion depth exceeded python递归深度报错
- python递归深度报错--RuntimeError: maximum recursion depth exceeded
- python递归深度报错: RuntimeError: maximum recursion depth exceeded
- python递归报错 RuntimeError: maximum recursion depth exceeded
- Python RuntimeError: maximum recursion depth exceeded in cmp 超过最大递归深度错误
- python RuntimeError: maximum recursion depth exceeded
- python RuntimeError: maximum recursion depth exceeded
- RuntimeError: maximum recursion depth exceeded
- RuntimeError: maximum recursion depth exceeded 递归深度报错
- RuntimeError: maximum recursion depth exceeded 递归深度报错
- Django RuntimeError: maximum recursion depth exceeded
- 当python超出默认递归次数RecursionError: maximum recursion depth exceeded in comparison
- python使用pip安装一个module时报错:RuntimeError: maximum recursion depth exceeded
- python setup.py install 出现了 RuntimeError: maximum recursion depth exceeded in cmp
- RuntimeError: maximum recursion depth exceeded while calling a Python object解决办法
- cx_freeze打包出错:runtimeerror:maximum recursion depth exceeded
- 安装Django启动时报错:RuntimeError: maximum recursion depth exceeded
- struts2为什么每次请求都要创建一个Action对象
- 山东省第八届ACM省赛J题company(C-DP,贪心)
- xmemcached的集成spring配置
- Spring MVC 学习手记(3)- HiddenHttpMethodFilter 过滤器
- 改变图片内存的技巧
- python 最大递归次数 RuntimeError: maximum recursion depth exceeded
- LeetCode 1 Two Sum
- 自定义View
- jQuery实现加入购物车飞入动画效果
- BIOS 工作流程解析
- 文章标题
- Python实现几种排序算法
- 求解二元一次方程(难度:2颗星)
- 纳税服务系统【角色模块、包含权限】