关于python:`extend`比`+ =`快吗?

Is `extend` faster than `+=`?

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

  • 扩展(另一个步骤)
  • lst+=另一个
  • 我认为extend比使用+=更快,因为它重用了列表,而不是使用其他两个来创建新的列表。

    但当我用timeit测试时,发现+=更快,

    1
    2
    3
    4
    5
    6
    7
    8
    >>> 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 machine指出了不一致之处。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    >>> 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。任何细微的性能差异都可以归结为这一点。