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
+=
更快(大约 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
逻辑上等同于追加,但如您所见,速度要快得多。
所以解释一下:迭代比+
因为+
必须构造一个全新的列表更快
extend
比迭代更快,因为它是一个内置的列表方法并且已经过优化。逻辑上等同于重复追加,但实现方式不同。
+=
比它更快,extend
因为它可以就地修改列表,知道列表必须有多大并且没有重复的函数调用。它假设您将列表附加到另一个列表/元组