知识点讲解四:栈溢出(stack overflow)问题解决方案
发布日期:2021-07-01 04:21:28 浏览次数:16 分类:技术文章

本文共 560 字,大约阅读时间需要 1 分钟。

在爬取某个网页的时候遇到了这个问题:

Fatal Python error: Cannot recover from stack overflow


我问题所在:使用函数时递归调用次数过多(800左右会出现),导致栈溢出。

在Python中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,相当于一次push压栈操作,每当函数返回,相当于一次pop出栈操作。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

Windows程序的内存机制大概是这样的,全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;函数地址、函数参数、局部变量等信息存储于栈内存,栈内存较小容易发生溢出现象,但是效率高。


栈溢出的可能原因:

1. 函数递归调用层次过深 ,每调用一次,函数的参数、局部变量等信息就压一次栈,并且没有及时出栈。
2. 局部变量体积太大

可以通过下面这张图来辅助我们理解,当栈的空间接近被占完时,会发生溢出现象

还在路上,稍等...

解决方案:

1.把递归调用函数改用while或者for循环来实现
2.通过尾递归优化
3.改用堆内存,函数里定义很大的局部变量(例如大数组),这种情况可以将局部变量改为静态变量(实质上也是全局变量)。
4.增大栈的大小值


参考文章:

转载地址:https://mtyjkh.blog.csdn.net/article/details/81903404 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:知识点讲解八:Python中的尾递归
下一篇:更新pip到指定版本

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月30日 19时59分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章