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 |
为什么,我的意见是平等的,但不是。
所以从这个例子中,解包很快,对吗?
- 标识符set可以重新定义,因此需要额外的字典查找,但这可能无法解释整个差异。
- @Michaelbutscher感谢您的评论,帮助我:—)
出于同样的原因,[]比list()快;解释器包括对使用专用代码路径的基于语法操作的专用支持,而构造函数调用包括:
从内置作用域加载构造函数(需要一对dict查找,一个在全局作用域中,另一个在内置作用域中,当它失败时)
需要通过通用可调用调度机制和通用参数解析代码进行调度,所有这些都比将堆栈中所有参数作为C数组读取的单字节代码昂贵得多。
所有这些优点都与固定开销有关;两种方法的大O是相同的,因此{*range(10000)}不会比set(range(10000))快得明显/可靠,因为实际的施工工作大大超过了通过通用调度加载和调用构造函数的开销。
- 谢谢你的回答,[]也比list()快,哇,解释得好,8分钟就可以接受了。