python 递归函数 内存_Python递归深度扩到……100万

递归是个好东西,我们可以用递归方法写出简洁明快的程序。

当你高高兴兴地把只有寥寥数行的漂亮递归DFS算法,在作业的10万个顶点图上一跑:RecursionError: maximum recursion depth exceeded while calling a Python object

经查,Python里有这么个限制:递归深度限制

用setrecursionlimit扩?递归深度增加

但说是一狠心扩到100万,其实程序还是有调用栈空间大小的限制,最多支持个3万左右的递归深度,一旦超过这个数,另一种错误上演了:Fatal Python error: Segmentation fault

这是Python解释器直接扑街啊!

区区几万次调用,一眨眼的事情,被系统栈空间卡了脖子。我不应该为系统栈空间发愁

大佬们可以把递归转为非递归,编程纯手工操纵一个栈来弥补系统调用栈的过小尺寸。

……emmm,可是调用栈能用多少内存?为什么我的8G/16G/32G内存不拿去花,搞这个幺蛾子?捧着金碗要饭?

好吧,搜遍了网络,也难看到有什么好办法突破3万这个限制,更多的博主在苦口婆心劝你把算法改尾递归,改非递归,改……。

扩大个栈空间就能解决问题,为啥要去重写算法呢?跑程序的时间是时间,可编程序的时间也是时间啊,鲁迅说过:金钱买得到CPU和内存,但买不到时间。——鲁迅(bushi

终于,在互联网的一个角落,我们找到了把递归深度提高到100万的方法!只需要你对程序做一个微不足道的重新排版吧。http://codeforces.com/blog/entry/64701

这个方法第一部分,除了setrecursionlimit之外,还要threading模块来设定栈空间,这个可以设置为很大也没问题,毕竟你有很多内存是吧hhh用threading模块来设定栈空间

第二部分,就是你自己的程序了,该建图建图,该递归递归。

我们用一个最简单的递归求和程序来演示一下:递归求列表元素的和

第三部分:把实际运行的所有功能都拢到一起,这个函数随便叫什么(叫main可能更职业一点?)把实际运行的所有功能都拢到一个函数里

然后,启动个线程来跑它,这样就用了你扩出来的栈空间了,最后一行别忘了等它结束。

在示例程序里,递归深度100万,妥妥的没问题,其实还可以更多:递归深度100万

怎么样?快加上这几行代码,把10万个顶点的作业跑完吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值