假设我有两个列表,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中做了什么?
答案 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