Python中设置递归限制/栈大小的不同方法区别及选择
Python调整递归栈限制两种方案的区别与选型
两种方案的核心区别
- 适用平台不同:第一种调用
resource模块的方案仅支持类Unix系统(Linux、macOS等),Windows平台没有内置resource模块,运行会直接抛出导入错误。第二种用threading配置栈大小的方案是跨平台实现,Windows、Linux、macOS均可正常运行。 - 作用范围不同:第一种修改的是当前进程主栈的栈大小限制,配置完成后主程序直接可以运行高递归深度的代码,不需要额外调整代码结构。第二种修改的是后续新建线程的默认栈大小,主程序本身的栈大小没有变化,必须把递归逻辑放到新启动的子线程中运行才能生效。
- 默认栈容量不同:第一种配置的栈大小为
2**29即512MB,第二种默认配置的是64MB栈空间,如果你实现的递归逻辑每层占用内存较大、总深度很高,第一种的默认配置能承载的递归规模更大。 - 权限要求不同:第一种调用
setrlimit调整栈硬限制时,部分系统可能需要管理员权限才能设置过高的值,否则会触发权限异常。第二种设置线程栈大小不需要额外权限,普通用户身份即可正常执行。
算法竞赛场景选型建议
如果你的竞赛运行环境明确是Linux(目前绝大多数算法竞赛的OJ后端都采用Linux系统),优先选择第一种方案:
- 代码更简洁,不需要把递归逻辑封装到
main函数再额外启动线程,配置完成后直接运行主逻辑即可 - 默认512MB的栈空间足够应对几乎所有竞赛题的递归需求,极少出现栈溢出问题
如果你的运行环境是Windows,或者需要在本地Windows设备上调试代码,选择第二种方案:
- 跨平台兼容,不会出现模块缺失错误
- 如果默认64MB栈不够用,可以自行调大
threading.stack_size的参数,比如调整为2**29即可获得和第一种方案相同的512MB栈空间
注意:无论选用哪种方案,
sys.setrecursionlimit设置的数值必须大于你实际需要的递归深度,否则Python会优先触发自身的递归深度限制报错,和栈空间大小无关。
内容的提问来源于stack exchange,提问作者planetp
相关产品推荐
相关产品推荐

