在 python 中,我们可以通过两种方式连接列表:
- lst.extend(another_lst)
- lst += another_lst
我认为 extend
会比使用 +=
更快,因为它会重用列表而不是使用其他两个创建新列表。
但是当我用 timeit
测试时,结果是 +=
更快,
>>> timeit('l.extend(x)', 'l = range(10); x = range(10)')
0.16929602623
>>> timeit('l += x', 'l = range(10); x = range(10)')
0.15030503273
>>> timeit('l.extend(x)', 'l = range(500); x = range(100)')
0.805264949799
>>> timeit('l += x', 'l = range(500); x = range(100)')
0.750471830368
我放在timeit
中的代码有问题吗?
最佳答案
编辑:我已经测试了性能,但我无法将差异复制到任何显着水平。
这是字节码——感谢@John Machin 指出不一致之处。
>>> import dis
>>> l = [1,2,3]
>>> m = [4,5,6]
>>> def f1(l, m):
... l.extend(m)
...
>>> def f2(l,m):
... l += m
...
>>> dis.dis(f1)
2 0 LOAD_FAST 0 (l)
3 LOAD_ATTR 0 (extend)
6 LOAD_FAST 1 (m)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>> dis.dis(f2)
2 0 LOAD_FAST 0 (l)
3 LOAD_FAST 1 (m)
6 INPLACE_ADD
7 STORE_FAST 0 (l)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
请注意,extend
使用了 CALL_FUNCTION
而不是 INPLACE_ADD
。任何微不足道的性能差异都可能归因于此。
关于python - `extend` 比 `+=` 快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176980/