【问题标题】:Which is faster, a set comprehension or set difference? [closed]集合理解或集合差异哪个更快? [关闭]
【发布时间】:2021-08-09 19:14:54
【问题描述】:

我有两个列表:

from secrets import token_urlsafe

a = [token_urlsafe() for i in range(100)]
b = a[50:]

我需要找出这两个列表之间的区别。我使用集合推导还是集合差异?

Python 文档描述了执行此操作的两种方法

设置差异

set(a) - set(b)

返回一个新集合,该集合中的元素不在其他集合中

ref

设置理解

{i for i in a if i not in b}

使用集合推导:{c for c in 'abracadabra' if c not in 'abc'}

ref

【问题讨论】:

  • 好吧,这里的集合理解肯定会慢一些,因为b 是一个列表。它应该是set,所以你可以使用b = set(a[50:])
  • @khelwood 这个问题是有效的,因为set Python 文档提到了集合理解,并给出了与上面类似的示例,而没有评论性能影响。见:docs.python.org/3/library/stdtypes.html#set
  • 谢谢,@juanpa.arrivillaga!引发这个问题的原因是 Python 文档在使用集合理解时不会创建集合,并没有提到预先转换为 set。事实上,它使用了明确的string
  • 引用的有关集合推导的 Python 文档建议您使用该示例来确定集合差异。它显示了理解的语法。
  • @martineau 引用的关于集合理解的 Python 文档是否具有集合效果具有集合理解?是的,它确实。作为阅读设置文档的人,我是否想知道它会更快还是更慢?是的,我做到了。我希望其他人也有同样的问题,所以我在这个问答网站上记录了它。如果您想跟进此对话,请随时在场外给我发电子邮件。我将不再在这里跟进。祝你有美好的一天!

标签: python set


【解决方案1】:

我们可以看到使用timeit设置差分法更快:

>>> timeit.timeit(lambda: set(a) - set(b), number=100000)
0.37637379999796394

>>> timeit.timeit(lambda: {i for i in a if i not in b}, number=100000)
5.430218600013177

请注意,时间可能会因集合 a 的长度、集合 b 的长度以及共同元素的数量以及它们共同的位置而异。

【讨论】:

  • @MikkoOhtamaa:不管这是否是一种得分策略,所做的比较都是虚假的,因为b 是一个列表,而不是一组——这可能值得一票否决。
  • @martineau ab 都是列表。欢迎您运行代码并运行type 检查。
  • 它们不是集合理解中的两个集合。
  • @martineau 你能详细说明一下吗?
  • 它们都是set(a) - set(b)中的集合。在{i for i in a if i not in b} 中,变量b 是一个列表,因此它对列表的所有元素进行非常缓慢的线性搜索)——所以当然它更慢。这里没有惊喜。
猜你喜欢
  • 2021-09-15
  • 2016-07-31
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 2019-04-12
相关资源
最近更新 更多