为什么`{* l}`比`set(l)`更快-python集合(不仅是集合,而且是所有序列)


问题内容

所以这是我的时间安排:

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

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

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


问题答案:

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

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

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