Python 有多少种方法可以将元素添加到列表中?哪种方法最快?

Python 有多少种方法可以将元素添加到列表中?哪种方法最快?,python,list,Python,List,当我参加一次工作面试时,我问了一个关于Python的问题:有多少种方法可以将一个元素添加到列表中,哪种方法最快 我知道我可以使用列表的方法,比如append,insert,当然还有+。那么,还有其他的吗?哪一个最快,为什么?让我们来看看!这是使用ipython的%%timeit魔术功能 In [5]: %%timeit x = [] ...: x = x + [1] ...: 10000 loops, best of 3: 21.5 us per loop In [6]: %%ti

当我参加一次工作面试时,我问了一个关于Python的问题:有多少种方法可以将一个元素添加到列表中,哪种方法最快


我知道我可以使用列表的方法,比如
append
insert
,当然还有
+
。那么,还有其他的吗?哪一个最快,为什么?

让我们来看看!这是使用ipython的
%%timeit
魔术功能

In [5]: %%timeit x = []
   ...: x = x + [1]
   ...:
10000 loops, best of 3: 21.5 us per loop

In [6]: %%timeit x = []
x.append(1)
   ...:
1000000 loops, best of 3: 93.7 ns per loop

In [7]: %%timeit x = []
x.insert(0, 1)
   ...:
100000 loops, best of 3: 30 us per loop

In [8]: %%timeit x = [1,2,3]
x.insert(len(x), 1)
   ...:
1000000 loops, best of 3: 293 ns per loop

In [9]: %%timeit x = []
x.extend([1])
   ....:
1000000 loops, best of 3: 208 ns per loop

In [15]: %%timeit x = []
x += [1]
   ....:
10000000 loops, best of 3: 165 ns per loop
因此
append
是最快的,其次是
+=
,然后是
extend()
,最后是
insert
ing。这是因为Python不必创建新列表(如
+
)或移动所有元素(如在开头插入)

值得注意的是,
x=x+[1]
x+=[1]
慢200多倍。下次性能真正重要时,请记住这一点

现在,对于附加非常大的列表,这种行为可能会有所不同。区别并没有那么明显:

In [17]: %%timeit y = []
y = y + range(1000000)
   ....:
10 loops, best of 3: 76.8 ms per loop

In [18]: %%timeit y = []
y += range(1000000)
   ....:
10 loops, best of 3: 23.4 ms per loop
但在将添加到非常大的列表的情况下肯定是这样的:

In [24]: %%timeit y = range(1000000)
y.append(1)
   ....:
10000000 loops, best of 3: 92.7 ns per loop

In [29]: %%timeit y = range(1000000)
y.insert(len(y), 1)
   ....:
1000000 loops, best of 3: 293 ns per loop

In [30]: %%timeit y = range(1000000)
y = y + [1]
   ....:
100 loops, best of 3: 12.6 ms per loop

这在性能上相差130927次!这就是为什么这是一个面试问题。

+
不会修改原始列表<代码>+=没有
+=
extend
是一样的。追加,或在末尾插入是最快的,并且有O(1)个摊销时间。在列表中除常量结尾以外的任何位置插入都具有O(n)时间复杂度

还请注意,方法查找对性能有非常显著的影响,因此最快的代码实际上是

the_list = []
append = the_list.append

# later...
append(item)

如果需要对同一个列表重复操作。

最快的是不复制列表且不需要移动元素的列表。回答不错,我还认为
append
是最快的。那么还有其他方法吗?