【问题标题】:Why is `{*l}` faster than `set(l)` - python sets (not really only for sets, for all sequences)为什么 `{*l}` 比 `set(l)` 快 - python 集合(不仅适用于集合,适用于所有序列)
【发布时间】:2019-04-12 15:56:12
【问题描述】:

所以这是我的时间安排:

>>> import timeit
>>> timeit.timeit(lambda: set(l))
0.7210583936611334
>>> timeit.timeit(lambda: {*l})
0.5386332845236943

为什么会这样,我的意见是平等的,但事实并非如此。

所以从这个例子中解包很快,对吧?

【问题讨论】:

  • 标识符 set 可以重新定义,因此需要额外的字典查找,但这可能无法解释全部差异。
  • @MichaelButscher 谢谢你的评论,帮助了我:-)

标签: python set sequence timing unpack


【解决方案1】:

出于同样的原因[] is faster than list();解释器包括对使用专门代码路径的基于语法的操作的专门支持,而构造函数调用涉及:

  1. 从内置范围加载构​​造函数(需要一对 dict 查找,一个在全局范围内,另一个在内置范围内失败时)
  2. 需要通过通用可调用调度机制和通用参数解析代码进行调度,所有这些都比将其所有参数作为 C 数组从堆栈中读取的单个字节码要昂贵得多

所有这些优点都与固定开销有关;两种方法的大 O 是相同的,所以 {*range(10000)} 不会明显/可靠地比 set(range(10000)) 快,因为实际的构造工作大大超过了通过通用调度加载和调用构造函数的开销。

【讨论】:

  • 谢谢你的回答,[]也比list()快,哇很好的解释,只能在8分钟内接受。
猜你喜欢
  • 2013-06-23
  • 2021-06-18
  • 1970-01-01
  • 2023-03-09
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多