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

两种Python求和实现方法运行时长存在差异的原因探究(含五次验证)

两种求和表达式的运行时长差异分析(五次验证)

嗨,咱们一步步拆解这两个求和写法为什么会出现这么不一样的运行时长,先看你在Colab里跑的测试代码:

from timeit import repeat
setup = 'a = [1] * 10_000_000'
expressions = [
 'sum(x % 2 for x in a)',
 'sum(True for x in a if x % 2)',
]
for expression in expressions:
 times = sorted(repeat(expression, setup, number=1))
 print(*('%.2f ' % t for t in times), expression)

结合三次不同输入的测试结果,咱们逐个分析背后的原因:

测试1:全1列表

0.65 0.65 0.65 0.65 0.66 sum(x % 2 for x in a)
1.03 1.04 1.04 1.05 1.06 sum(True for x in a if x % 2)

当列表里全是1时,x%2的结果永远是1(等价于True)。第一个表达式直接把x%2的计算结果(整数1)丢给sum,每个元素只需要做取模+传递两步;而第二个表达式要先做x%2的条件判断,确认符合后再生成True(本质也是1)——等于每个元素多了一次条件分支的开销,所以整体耗时明显更高。

测试2:全0列表

0.66 0.66 0.66 0.67 1.45 sum(x % 2 for x in a)
0.43 0.43 0.44 0.45 0.46 sum(True for x in a if x % 2)

这次列表全是0,x%2的结果都是0(等价于False)。第一个表达式还是要遍历所有1000万元素,计算x%2并把0累加到sum里;而第二个表达式的生成器会直接跳过所有不符合条件的元素,最终生成器里没有任何内容,sum几乎不需要做任何累加操作——少了大量的迭代和计算,自然耗时骤降。

测试3:range(10^7)(奇偶各半)

0.75 0.75 0.76 0.77 0.78 sum(x % 2 for x in a)
0.81 0.82 0.82 0.82 0.84 sum(True for x in a if x % 2)

当输入是range对象时,里面一半是奇数、一半是偶数。第一个表达式要处理全部1000万元素,每个元素做一次取模;第二个表达式只需要处理一半的奇数元素,但每个元素多了一次条件判断的步骤。这时候两种操作的开销互相抵消了一部分,所以第二个表达式只比第一个慢一点点。

核心结论

这两个表达式的性能差异本质上由两个因素决定:

  • 过滤比例:如果需要保留的元素越少,第二个带if过滤的表达式因为跳过了大量元素,性能会越好;反之如果所有元素都符合条件,额外的条件判断会拖慢速度。
  • 操作步骤:第一个表达式是计算结果直接累加,第二个是判断→生成值→累加,符合条件的元素多了一个分支判断的步骤,这部分是额外的开销。

另外补充一点:sum对整数和布尔值的累加效率几乎没有差异(因为bool是int的子类,True就是1),所以性能差异的核心还是在生成器的迭代逻辑上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:02:45