有多少方法可以将元素添加到列表中,哪个是最快的?

zha*_*gyu 3 python list

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

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

Chr*_*nus 12

我们来看看吧!这是使用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
Run Code Online (Sandbox Code Playgroud)

所以append最快,然后是+=,接着是extend(),然后insert在列表的末尾.这是因为Python不必创建新列表(比如with +)或移动所有元素(比如在开头插入).

这是有益的注意,x = x + [1]慢200倍x += [1].下次表现真的很重要时要记住这一点.

现在,此行为可能会因添加非常大的列表而有所不同.差异并不那么显着:

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
Run Code Online (Sandbox Code Playgroud)

但它肯定是附加非常大的列表:

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
Run Code Online (Sandbox Code Playgroud)

性能差异为130,927次!这就是为什么这是一个面试问题.