为什么`{*l}`比`set(l)`更快——Python中的集合(实际上对于所有序列都适用)

4

以下是我的时间安排:


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

为什么我的意见虽然相等,但却不被采纳。

所以从这个例子来看,解包速度很快,对吧?


1
标识符 set 可能会被重新定义,因此需要进行额外的字典查找,但这可能并不能完全解释差异。 - Michael Butscher
@MichaelButscher 感谢您的评论,帮助了我 :-) - U13-Forward
1个回答

6
由于相同的原因,[]list()更快; 解释器包括专门支持基于语法的操作的支持,使用专门的代码路径,而构造函数调用涉及以下内容:
  1. 从内置作用域加载构造函数(需要一对dict查找,一个在全局作用域中,当其失败时在内置作用域中进行另一个查找)
  2. 需要通过通用可调用分派机制和通用参数解析代码进行分派,所有这些都比从堆栈中读取其所有参数的单个字节码更加昂贵
所有这些优势都与固定开销有关;两种方法的大O是相同的,因此{*range(10000)}不会明显/可靠地比set(range(10000))更快,因为实际的构建工作远远超过了通过通用分派加载和调用构造函数的开销。

谢谢回答,[]list() 更快,哇,解释得很好,只能在8分钟内接受。 - U13-Forward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接