3

假设我有两个列表,A = [1,2,3,4] 和 B = [4,5,6]

我想要一个包含 A 和 B 的元素的列表。(我不在乎 A 本身是否被更改)。

我可以做的几件事,以及我对它们的理解(如果我错了,请告诉我):

A.extend(B)(B 的元素被添加到 A 中;A 本身被改变)

C = A + B(创建一个全新的对象 C,其中包含 A 和 B 的内容。)

我想了解哪个更有效,所以我想知道是否有人可以告诉我以下假设是否不正确。

在 A.extend(B) 的情况下,我假设 python 只需要执行 3 个列表添加操作(B 的 3 个元素,每个元素都附加到 A)。但是,在执行 A + B 时,python 是否不必遍历列表 A 和 B,在这种情况下执行 7 个列表添加操作?(即,它必须创建一个新列表,遍历 A 并将所有元素放入其中,然后遍历 B 并将所有元素放入其中)。

我是否误解了解释器如何处理这些事情,或者这些操作在 python 中做了什么?

4

1 回答 1

2

下面是这两种操作的字节码分析。两者之间没有主要的性能差异。唯一的区别是 .extend 方式涉及 CALL_FUNCTION,它在 Python 中比 BINARY_ADD 稍微贵一些。

但这应该不是问题,除非正在处理大量数据操作。

>>> import dis
>>> a = [1,2,3,4]
>>> b = [4,5,6]
>>> def f1(a,b):
...  a.extend(b)
>>> def f2(a,b):
...  c = a+ b
>>> dis.dis(f1)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (extend)
              6 LOAD_FAST                1 (b)
              9 CALL_FUNCTION            1
             12 POP_TOP             
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        
>>> dis.dis(f2)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BINARY_ADD          
              7 STORE_FAST               2 (c)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        
于 2017-09-18T04:25:20.567 回答