3

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

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

4

2 回答 2

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

Soappend是最快的,其次是+=,其次是extend(),然后insert是列表末尾的 ing。这是因为 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

但它肯定是在附加非常大的列表的情况下:

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倍!这就是为什么这是一个面试问题。

于 2013-10-19T01:25:10.290 回答
3

+不修改原名单;+=做。+=和 是一样的extend。在末尾追加或插入是最快的,并且具有 O(1) 的摊销时间。插入到列表中除常量末尾之外的任何位置具有 O(n) 时间复杂度。

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

the_list = []
append = the_list.append

# later...
append(item)

如果需要对同一个列表重复执行。

于 2013-10-19T01:25:28.763 回答