You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3中生成器表达式比map对象递归深度更低的原因探究

递归斐波那契生成器:map与生成器表达式的递归深度差异原因

先明确对应的递归生成器实现(基于Joel Grus的Haskell风格修改):

from itertools import pairwise

def fibs():
    yield 0
    yield 1
    # map版本
    # yield from map(sum, pairwise(fibs()))
    # 生成器表达式版本
    # yield from (sum(pair) for pair in pairwise(fibs()))

两者触发RecursionError的索引不同,核心原因在于迭代逻辑的执行层级不同,导致Python递归栈帧的累积速度有差异:

  • map版本依赖C层实现,减少Python栈帧占用
    map是Python内置的C扩展函数,它的迭代逻辑以及内部调用sum的过程,都是在C语言栈中执行的,不会占用Python解释器的递归栈帧。每次fibs()递归调用产生的栈帧,不会因为map的迭代操作额外增加,因此能支撑到索引1025才达到Python的递归栈限制。

  • 生成器表达式在Python字节码层执行,栈帧累积更快
    生成器表达式(sum(pair) for pair in pairwise(fibs()))的每一次迭代,都是在Python字节码层面处理的。sum的调用、生成器的next()操作都会新增Python栈帧,这些帧会随着递归调用持续累积,导致更快达到递归深度上限,所以仅到索引513就触发报错。

要注意的是,Python的RecursionError判断依据是Python解释器维护的栈帧数量,而非逻辑上的递归次数。C层实现的操作不会占用这些栈帧,这是两者差异的关键。

内容的提问来源于stack exchange,提问作者kleite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:25:33