关于为什么`{* l}`比`set(l)`更快“为什么`{* l}`比`set(l)`更快` – python集(不仅仅适用于所有序列的集合)

Why is `{*l}` faster than `set(l)` - python sets (not really only for sets, for all sequences)

下面是我的时间安排:

1
2
3
4
5
>>> import timeit
>>> timeit.timeit(lambda: set(l))
0.7210583936611334
>>> timeit.timeit(lambda: {*l})
0.5386332845236943

为什么,我的意见是平等的,但不是。

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


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

  • 从内置作用域加载构造函数(需要一对dict查找,一个在全局作用域中,另一个在内置作用域中,当它失败时)
  • 需要通过通用可调用调度机制和通用参数解析代码进行调度,所有这些都比将堆栈中所有参数作为C数组读取的单字节代码昂贵得多。
  • 所有这些优点都与固定开销有关;两种方法的大O是相同的,因此{*range(10000)}不会比set(range(10000))快得明显/可靠,因为实际的施工工作大大超过了通过通用调度加载和调用构造函数的开销。