当我参加面试时,我得到了一个关于Python的问题:有多少方法可以将一个元素添加到列表中,哪一个是最快的?
我知道我可以使用列表的方法,例如append
,insert
,当然还有+
。那么,还有其他人吗?哪一个是最快的,为什么?
答案 0 :(得分: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
所以append
最快,其次是+=
,然后是extend()
,然后是insert
在列表的末尾。这是因为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
表现差异 130,927 次!这就是为什么这是一个面试问题。
答案 1 :(得分:3)
+
不会修改原始列表; +=
。 +=
与extend
相同。追加或最后插入最快,并且具有O(1)摊销时间。除了列表中的常量末尾之外的任何位置插入都有O(n)时间复杂度。
另请注意,方法查找会对性能产生非常显着的影响,因此最快的代码实际上是
the_list = []
append = the_list.append
# later...
append(item)
如果需要重复执行相同的列表。