我正在比较将项目追加到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] 删除。
我来说两句