【问题标题】:list comprehension vs filter() vs set difference: which is the most efficient when filtering a set?列表理解与过滤器()与集合的区别:过滤集合时哪个最有效?
【发布时间】:2020-08-25 01:40:13
【问题描述】:

考虑到我有:

  • 1 个整数数组转换为一个集合(命名为neighbors

  • 要避免的其他 3 组整数(命名为 forbidden1forbidden2forbidden3

__

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/ filter() 与逻辑运算符and

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,因为集合基本上针对成员检查进行了优化。另请注意,您可以在AB 中使用集合理解,方法是将[ ] 替换为{ }
  • 对,我忘了这些。感谢您的提醒。我也会押注 E,但需要一些关于幕后发生的事情的解释。
  • 这完全是另一个问题 - 确定哪些代码运行得更快是一回事,确定 为什么 它会这样做是另一回事。

标签: python filter set list-comprehension set-difference


【解决方案1】:

试过了(timeit python):

A) 294 ns ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
B) 297 ns ± 26.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
C) 300 ns ± 31.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
D) 294 ns ± 19.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
E) 291 ns ± 21.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

一切都差不多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2011-04-21
    • 2012-04-08
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多