`extend`比`+ =`更快?

时间:2010-11-14 09:47:50

标签: python performance list

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

  1. lst.extend(another_lst)
  2. lst + = another_lst
  3. 我认为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 个答案:

答案 0 :(得分:17)

编辑:我已经测试了性能,我无法将差异复制到任何重要级别。


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