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

在列表推导式内声明集合为何远慢于提前声明?(Python 3.9.13)

为什么提前声明集合比在列表推导式内声明快几个数量级?

核心原因是重复创建集合的巨大开销,两种写法的执行逻辑完全不同:

  • 第一种写法中,b = set(b)只执行一次,把列表b转换为集合后,后续列表推导式里的x in b都是O(1)的高效集合查找。总开销是「1次集合转换(O(m),m是b的长度8000) + 10000次O(1)查找」,整体时间复杂度是O(m + n)。

  • 第二种写法里,set(b)被放在了列表推导式的if条件中,这意味着遍历a的每一个元素时,都会重新把列表b转换成集合一次。a有10000个元素,就等于执行了10000次set(b)操作。每次集合转换的开销是O(m),总时间复杂度直接变成O(nm)=100008000,这两种时间复杂度的差距直接导致了性能差几个数量级。

你可以做个验证:如果把第二种写法改成只创建一次集合,耗时会和第一种几乎一致:

t = time.time()
b_set = set(b)
[x for x in a if x in b_set]
print(time.time() - t)

内容的提问来源于stack exchange,提问作者Ludvig J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:25:18