列出连接效率

时间:2017-09-18 03:00:57

标签: python list concatenation coding-efficiency

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

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

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

object(B的元素被添加到A中; A本身被更改)

Provider(制作一个全新的对象C,其中包含A和B的内容。)

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

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

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

1 个答案:

答案 0 :(得分: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