`extend`比`+=`快吗?

11 投票
1 回答
5848 浏览
提问于 2025-04-16 07:03

在Python中,我们可以通过两种方式来连接列表:

  1. 使用 lst.extend(another_lst)
  2. 使用 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 中写的代码是不是有什么问题?

1 个回答

18

更新:我测试了性能,发现无法重现任何明显的差异。


这是字节码——感谢@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。任何微不足道的性能差异可能都可以归结为这个原因。

撰写回答