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

标签 python set sequence timing unpack

所以这是我的时间安排:

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

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

所以从这个例子中解压速度很快,对吧?

最佳答案

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

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

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

    关于python - 为什么 `{*l}` 比 `set(l)` 快 - python 集合(不仅仅是对于集合,对于所有序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53219640/

    相关文章:

    python - Armadillo 中的矩阵( vector )在从文件加载后获得新的小数位

    Python 类实例的计算结果为假?

    c++ - 在 C++ 中查找一组结构

    javascript - 如何编写递归函数来获取表示每个值排列集合的数组?

    python - 什么时候可以设置 dict_values View (为什么)?

    c++ - lambda表达式移动捕获的时机

    python - 将多个数据帧与互补缺失值组合起来的最有效方法

    python - 我正在尝试创建一个地址簿程序,它将用户输入附加到其适当的列表中

    sequence - 在 SQL Azure 联合上生成序列号的有效方法

    java - 我可以在 Hibernate 中创建自己的序列吗?