Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表串联效率_Python_List_Concatenation_Coding Efficiency - Fatal编程技术网

Python 列表串联效率

Python 列表串联效率,python,list,concatenation,coding-efficiency,Python,List,Concatenation,Coding Efficiency,假设我有两个列表,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=[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中做了什么?

下面是对这两个操作的字节码分析。两者之间没有重大的性能差异。唯一的区别是.extend方法涉及一个CALL_函数,这在Python中比二进制_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        

是的,
A+B
总是需要复制
A
B
的元素,而
A.extend(B)
有时只需要将
A
的元素移动到其他地方,以便为
B
的元素的复制腾出空间。有时候这并不重要。