列表推导、filter()与集合差集:过滤集合时哪种效率最高?
集合过滤效率最优方案分析
嘿,咱们来好好拆解这个集合过滤的效率问题,先把已知条件用代码清晰呈现:
neighbors = {6, 12, 9} forbidden1 = {1, 4, 7, 8} forbidden2 = {2, 5, 0, 3} forbidden3 = {6, 9}
问题
请问以下哪种方案过滤首个集合中的禁用值效率最高?原因是什么?
选项
- 选项A:带if语句与逻辑运算符
and的列表推导:[x for x in neighbors if x not in forbidden1 and x not in forbidden2 and x not in forbidden3] - 选项B:带if语句与联合运算符
|的列表推导:[x for x in neighbors if x not in forbidden1 | forbidden2 | forbidden3] - 选项C:带逻辑运算符
and的filter():filter(lambda x: x not in forbidden1 and x not in forbidden2 and x not in forbidden3, neighbors) - 选项D:带联合运算符
|的filter():filter(lambda x: x not in forbidden1 | forbidden2 | forbidden3, neighbors) - 选项E:带联合运算符
|的集合差集:neighbors.difference(forbidden1 | forbidden2 | forbidden3)
效率分析与结论
最优方案是选项E,原因如下:
集合原生操作的底层优势:Python的集合是基于哈希表实现的,而
difference这类集合原生方法是直接用C语言实现的底层操作,完全避开了Python层面的循环、函数调用等额外开销,执行速度远快于Python级别的遍历逻辑。对比其他选项的劣势:
- 选项A、C:每个元素要分别检查3次集合成员资格,A的列表推导是Python级循环,C还多了lambda表达式的调用开销,两者效率都远低于先合并禁用集合再操作的方式。
- 选项B、D:虽然先合并了禁用集合(
|也是高效的集合原生操作),但后续的列表推导(B)或filter+lambda(D)仍然是Python层面的遍历操作,相比集合原生差集,还是有额外的循环和判断开销,其中D的lambda调用会比B更慢。 - 选项E:
difference方法直接在底层完成两个集合的差集计算,不需要逐个遍历元素做检查,合并禁用集合的开销也可以忽略不计,整体性能是所有选项里最高的。
哪怕禁用集合的规模变大,集合合并和差集的底层操作依然能保持高效,这是Python层面的遍历逻辑无法比拟的。
内容的提问来源于stack exchange,提问作者solub
相关产品推荐
相关产品推荐

