Python集合运算效率高于列表/元组,因其基于哈希表实现:成员检查平均O(1),交/并/差为O(min(len(s),len(t)));交集set(a)&set(b)比列表推导快10–100倍;注意元素须可哈希。

Python中集合(set)的运算效率远高于列表或元组的等价操作,核心原因在于其底层基于哈希表实现,平均时间复杂度为 O(1) 的成员检查和 O(min(len(s), len(t))) 的交/并/差运算。实际性能差异在数据量增大时尤为明显。
交集(&):set比list推导快10–100倍
对两个含万级元素的容器求公共元素,用 set(a) & set(b) 比 [x for x in a if x in b] 快得多——后者对每个 a 中元素都要遍历整个 b,最坏 O(n×m);而集合交集只需遍历较小集合,每次哈希查找接近 O(1)。
- 推荐写法:
common = set(list_a) & set(list_b) - 若原始数据已是集合,直接
s1 & s2,避免重复转换 - 注意:元素必须可哈希(如不能含列表、字典)
并集(|)和差集(-):同样依赖哈希,但内存开销略高
s1 | s2 创建新集合,内部遍历两个集合插入所有唯一元素;s1 - s2 遍历 s1,对每个元素查是否在 s2 中。两者均为线性时间,但差集因需哈希查找,常数因子略大。
- 原地操作更省内存:
s1.update(s2)替代s1 = s1 | s2 - 判断子集用
s1 ,比 <code>all(x in s2 for x in s1)快一个数量级 - 大数据场景下,先转 set 再运算,别在循环里反复调用
in list
实际性能对比(10万整数样本)
在典型测试中(Intel i5, Python 3.11),相同逻辑的耗时大致如下:
立即学习“Python免费学习笔记(深入)”;
- list in 判断(逐个):约 2800 ms
- set in 判断(逐个):约 12 ms
- set & set(交集):约 8 ms
- set | set(并集):约 15 ms
差距主要来自算法复杂度本质不同,而非语法糖优化。
注意事项:别让类型转换拖慢整体速度
频繁在 list ↔ set 间来回转换会抵消集合运算优势。例如在循环中反复写 if x in set(big_list),不如提前 big_set = set(big_list) 复用。
- 一次性转换,多次使用
- 小数据(
- 需要有序结果?运算后转 list 再排序,别用 list 模拟集合逻辑











