为什么Python中any(True for x in a if x%2)比any(x%2 for x in a)速度快?
性能差异的核心原因
两者的开销差异来自生成器返回值的传递和any()的真值判断步骤,在全偶数的测试场景下(需要遍历完整列表),这部分开销会被放大:
- 第一种写法
any(x % 2 for x in a)的每轮迭代流程:- 计算
x % 2得到整数结果 - 生成器把整数结果yield给
any()函数 any()对接收到的整数做真值判断,确认是假值后继续下一轮迭代
- 计算
- 第二种写法
any(True for x in a if x % 2)的每轮迭代流程:- 计算
x % 2得到整数结果 - 生成器内部直接判断
x % 2的真值,为假时直接跳过yield步骤,进入下一轮迭代 any()没有接收到任何返回值,不需要额外执行真值判断逻辑
- 计算
第二种写法省去了每次迭代的返回值传递、any()端的真值判断两步开销,遍历千万级元素时累积的性能优势就会非常明显。如果列表中存在奇数,第二种写法一旦匹配到奇数就会yield固定的布尔值True,any()对布尔值的真值判断开销也远低于对整数的判断开销,仍然会比第一种写法快。
内容的提问来源于stack exchange,提问作者no comment
相关产品推荐
相关产品推荐

