python-栈溢出(stack overflow)问题解决方案
栈溢出(stack overflow)问题解决方案
场景:
eg:
Fatal Python error: Cannot recover from stack overflow
原因: 使用递归函数调用过多导致栈溢出。
在Python中,函数调用,通过栈(stack)实现;
当进入函数调用,相当于一次push压栈操作,每当函数返回,相当于一次pop出站操作。由于栈的大小不是无限的,所以递归调用次数过多,会导致栈的溢出。
Windows程序的内存机制大概是:
全局变量(局部的静态变量本质也属于此范围)存储于堆内存, 该段内存较大, 一般不会溢出;函数地址、参数、局部变量等信息存储于栈内存,栈内存较小容易发生溢出现象,但是效率较高。
总结:
- 函数递归调用层次过深,每次调用一次, 函数参数、局部变量等信息就压栈一次,并且没有及时出站;
- 局部变量体积太大;
解决方法
1、递归调用改用while 或者for 循环实现(推荐使用);
2、通过尾递归 + 生成器的方法;
3、改用堆内存, 函数定义很大的局部变量(eg: 大数组),此时局部变量可以改变为静态变量(或者全局变量);
4、增大栈的大小值。
尾递归+生成器
eg:
import types
def f_recursive(cur_i, cur_computer_result=1):
if cur_i == 1:
yield cur_computer_result
yield f_recursive(cur_i - 1, cur_i + cur_computer_result)
def f_recursive_wapper(generator, i):
gen = generator(i)
while isinstance(gen, types.GeneratorType):
gen = gen.__next__()
return gen
print(f_recursive_wapper(f_recursive,10000))
修改栈的大小
import sys
sys.setrecursionlimit(2000)
def f(i):
if i == 1:
return 1
return i + f(i -1)
result = f(999)
print(result)
分类:
python
, python代码优化
标签:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?