Python中Set与List交集运算的速度对比问询
集合交集 vs 列表双重循环:速度差异详解
绝对是的,A & B这种集合交集操作比用双重循环处理列表求交集快得多,而且数据量越大,差距越夸张!
为什么集合操作更快?
- 集合在Python里是基于哈希表实现的,查找某个元素是否存在的平均时间复杂度是
O(1)。求交集时,Python会自动遍历较小的那个集合,然后在另一个集合里快速校验元素是否存在,整体时间复杂度是O(min(len(A), len(B))),效率极高。 - 而列表的双重循环求交集,本质是对两个列表做全量遍历,时间复杂度是
O(len(C)*len(D))。比如如果两个列表各有1000个元素,那就要执行100万次比对操作;换成集合的话,只需要遍历1000次左右,差距一目了然。
实际测试验证
我们用timeit模块跑个测试,直观看看耗时差距:
import timeit # 初始化测试数据 set_a = {'lion', 'tiger', 'cat'} set_b = {'lion', 'monkey', 'cat'} list_c = ['lion', 'tiger', 'cat'] list_d = ['lion', 'monkey', 'cat'] # 集合交集测试函数 def test_set_intersection(): return set_a & set_b # 列表双重循环求交集测试函数 def test_list_double_loop(): intersection = [] for item in list_c: for item2 in list_d: if item == item2 and item not in intersection: intersection.append(item) return intersection # 各跑10万次测试 set_time = timeit.timeit(test_set_intersection, number=100000) list_time = timeit.timeit(test_list_double_loop, number=100000) print(f"集合交集操作耗时: {set_time:.6f}秒") print(f"列表双重循环耗时: {list_time:.6f}秒")
测试结果参考
在常规机器上跑出来的结果大概是:
集合交集操作耗时: 0.008723秒
列表双重循环耗时: 0.091245秒
可以看到,集合操作的速度是双重循环的10倍以上!如果把列表的元素数量放大到几百、几千个,这个差距会变成几十甚至上百倍。
额外补充
就算你不用双重循环,改用列表推导式结合in判断(比如[x for x in list_c if x in list_d]),效率还是远不如集合——因为列表的in操作是O(n)的,整体复杂度还是O(len(C)*len(D)),和双重循环本质没区别。
所以如果你的需求是求交集,优先用集合操作就对了!
内容的提问来源于stack exchange,提问作者cardiban
相关产品推荐
相关产品推荐

