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

U10*_*ard 2 python timing set unpack sequence

所以这是我的时间:

>>> import timeit
>>> timeit.timeit(lambda: set(l))
0.7210583936611334
>>> timeit.timeit(lambda: {*l})
0.5386332845236943
Run Code Online (Sandbox Code Playgroud)

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

因此,从这个例子中拆包很快,对吧?

Sha*_*ger 5

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

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

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