是什么使Python的列表附加方法如此之快?

大卫

我正在比较将项目追加到python中的列表的不同方式。我在计算机上进行了测试,结果在其他计算机上当然会有所不同。

选项1:5.80秒仅50,000个项目!

a = []
for i in range(50000):
    a = a + [i]

选项2:2.27秒10,000,000个项目

a = []
for i in range(10000000):
    a += [i]

选项3:1.53秒10,000,000项

a = []
for i in range(10000000):
    a.append(i)

选项1变慢也就不足为奇了,因为它每次都会创建列表的新副本。

使用扩展分配运算符,选项2快得多。它会修改原始列表。

但是选项3仍然明显更快。我希望使用append()方法和增强的赋值运算符可以得到相同的结果。

为什么append()方法仍然比+ =运算符快得多?

PS:我的python版本:

在Win32上的Python 3.5.2(v3.5.2:4def2a2901a5,Jun 25 2016,22:18:55)[MSC v.1900 64位(AMD64)]

根据任务的答案,额外的开销是由[i]在每次循环迭代中创建一个新的列表对象引起的在我看来,这是合理的。我创建了新的测试代码,试图避免每次迭代都创建一个新对象。是的,它现在更快,但仍然不如使用append()快,因为现在我又有了额外分配的开销。但是我认为这证明了任务的重点。

选项4:1.91秒,10,000,000个项目(选项2的改进版)

a = []
b = [0]
for i in range(10000000):
    b[0] = i
    a += b
任务

第二种方法仍然需要创建临时列表[i]查看反汇编的代码:

>>> import dis
>>> def func_2(a, i):
...     a += [i]
... 
>>> def func_3(a, i):
...     a.append(i)
... 
>>> dis.dis(func_2)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (i)
              6 BUILD_LIST               1
              9 INPLACE_ADD         
             10 STORE_FAST               0 (a)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        
>>> dis.dis(func_3)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (append)
              6 LOAD_FAST                1 (i)
              9 CALL_FUNCTION            1
             12 POP_TOP             
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        
>>> 

第二种方法需要,6 BUILD_LIST但第三种方法则不需要。可能还有其他原因,但这应该是方法3更快的主要原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Python 3中“范围(10000000000000001)”如此之快?

是什么让gcc std :: list排序实现如此之快?

是什么使Java编译器如此之快?

为什么这个C ++程序如此之快?

为什么MATLAB在矩阵乘法中如此之快?

WebStorm调试javascript停止并断开的速度如此之快

为什么从内存映射文件读取如此之快?

为什么三元运算符如此之快?

Android Studio,工具提示消失得如此之快

为什么C ++模板计算如此之快?

为什么在Python 3中复数求幂如此之快?

为什么Dask的执行速度如此之慢,而多处理的执行速度却如此之快?

为什么在摩托罗拉68k中dbra对于这么大的循环计数如此之快?

为什么只有1个预配置读取容量单位的DynamoDB扫描速度如此之快?

使图像闪烁的最快方法->如此之快以至于您看不到它

为什么随后用youtube-dl下载的速度如此之快?

为什么OpenCV(cv2.pyd)的Python构建如此之小?

当今计算机如此之快,为什么查看PDF文件仍然很慢?

命令末尾的“&”如何使脚本如此之快?

为什么USB串行在Linux中如此之快?

为什么查询在Entity Framework中花费这么长时间,而在SQL中却如此之快呢?

为什么列表乘法如此之快?

为什么Spark从S3读取和写入如此之快

为什么默认的最大堆大小如此之小

libvirt:为什么将 LUN 直接附加到 KVM 来宾时 IOPS 如此之少

为什么 Pandas 的速度如此之快?如何定义这样的函数?

为什么此代码在进行优化编译时运行得如此之快?

海龟动画在python中如此之快

Python Pandas MySQL - 为什么在将数据帧写入数据库时 SQLite 速度如此之快