首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有多少种方法可以将元素添加到列表中,哪些是最快的?

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

Stack Overflow用户
提问于 2013-10-19 01:20:55
回答 2查看 335关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-19 01:25:10

让我们来看看吧!这是使用ipython的%%timeit魔术函数。

代码语言:javascript
运行
复制
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(),最后是inserting。这是因为Python不需要创建一个新列表(比如使用+)或移动所有元素(比如在开头插入)。

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

现在,这种行为可能因附加非常大的列表而有所不同。两者之间的差别没有那么显著:

代码语言:javascript
运行
复制
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

但在将添加到非常大的列表中时,情况肯定是这样的:

代码语言:javascript
运行
复制
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次性能的差异!这就是为什么这是个面试问题。

票数 12
EN

Stack Overflow用户

发布于 2013-10-19 01:25:28

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

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

代码语言:javascript
运行
复制
the_list = []
append = the_list.append

# later...
append(item)

如果需要,对相同的列表重复执行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19461275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档