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

列表推导、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,原因如下:

  1. 集合原生操作的底层优势:Python的集合是基于哈希表实现的,而difference这类集合原生方法是直接用C语言实现的底层操作,完全避开了Python层面的循环、函数调用等额外开销,执行速度远快于Python级别的遍历逻辑。

  2. 对比其他选项的劣势:

    • 选项A、C:每个元素要分别检查3次集合成员资格,A的列表推导是Python级循环,C还多了lambda表达式的调用开销,两者效率都远低于先合并禁用集合再操作的方式。
    • 选项B、D:虽然先合并了禁用集合(|也是高效的集合原生操作),但后续的列表推导(B)或filter+lambda(D)仍然是Python层面的遍历操作,相比集合原生差集,还是有额外的循环和判断开销,其中D的lambda调用会比B更慢。
    • 选项E:difference方法直接在底层完成两个集合的差集计算,不需要逐个遍历元素做检查,合并禁用集合的开销也可以忽略不计,整体性能是所有选项里最高的。

哪怕禁用集合的规模变大,集合合并和差集的底层操作依然能保持高效,这是Python层面的遍历逻辑无法比拟的。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:37:43