迭代vs列表连接

Ari*_*des 10 python performance profiling

因此,有两种方法可以获取列表并将第二个列表的成员添加到第一个列表中.您可以使用列表连接,也可以迭代它.您可以:

for obj in list2:
    list1.append(obj)
Run Code Online (Sandbox Code Playgroud)

或者你可以:

list1 = list1 + list2
Run Code Online (Sandbox Code Playgroud)

要么

list1 += list2
Run Code Online (Sandbox Code Playgroud)

我的问题是:哪个更快,为什么?我使用两个非常大的列表(超过10000个对象)对此进行了测试,似乎迭代方法比列表连接快得多(如l1 = l1 + l2).为什么是这样?谁能解释一下?

Rya*_*ing 15

append每次添加一个项目,这是其缓慢的原因,以及重复的函数调用append.

然而,在这种情况下,+=操作员不是语法糖+.该+=运营商实际上并没有建立一个新的列表,然后分配给它回来了,它改变了左手操作到位.timeit使用10,000次时非常明显.

>>> timeit.timeit(stmt="l = l + j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.5794978141784668
>>> timeit.timeit(stmt="l += j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.0013298988342285156
Run Code Online (Sandbox Code Playgroud)

+= 更快(约500倍)

你也有extend列表的方法,它可以附加任何可迭代的(不只是另一个列表)l.extend(l2)

>>> timeit.timeit(stmt="l.extend(j)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.0016009807586669922
>>> timeit.timeit(stmt="for e in j: l.append(e)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.00805807113647461
Run Code Online (Sandbox Code Playgroud)

在逻辑上相当于追加,但你可以看到更快.

所以要解释一下:迭代比+ 因为+必须构造一个完整的新列表更快

extend比迭代更快,因为它是内置列表方法并且已经过优化.逻辑上相当于重复附加,但实现方式不同.

+=extend它更快,因为它可以修改列表到位,知道列表必须有多大,没有重复的函数调用.它假设您将列表附加到另一个列表/元组