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

时间:2018-11-09 03:54:57

标签: python set sequence timing unpack

这是我的时间安排:

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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