Python串联与列表上的追加速度 [英] Python concatenation vs append speed on lists
问题描述
从interactivepython.org获取以下代码段:
Taking this snippet from interactivepython.org:
def test1(): # concat
l = []
for i in range(1000):
l = l + [i]
def test2(): # append
l = []
for i in range(1000):
l.append(i)
concat 6.54352807999 milliseconds
append 0.306292057037 milliseconds
最下面的方框是运行时间.
Where the bottom block is the run time.
它表示串联是O(k),其中k是要串联的列表的长度".我不确定这是否意味着要添加到的列表(原始)或要添加的列表.但是在这两个循环中,似乎您每次迭代仅执行1个步骤.那么为什么追加速度这么快?
It says concatenation is O(k), where k is the "length of the list being concatenated". I'm not sure if this means the list you are adding to (original), or the list you are going to be adding. But in both these loops it seems like you are just performing 1 step per iteration. So why is append so much faster?
推荐答案
如果将test1更改为:
If you change test1 to:
def test1(): # concat
l = []
for i in range(1000):
l += [i]
时间将近得多,实际上您正在做append
每次都没有创建新列表的事情.
the times will be much closer and you are actually doing what append
is doing not creating a new list each time.
In [26]: %timeit test1()
10000 loops, best of 3: 169 µs per loop
In [27]: %timeit test2()
10000 loops, best of 3: 115 µs per loop
如果将print id
放入代码中,则会在test1
中看到每次都在创建一个新对象,但是在test2
中,它始终是相同的列表:
If you put print id
in your code you will see in test1
you are creating a new object each time but in test2
it is always the same list:
In [41]: test1()
139758194625352
139758206001808
139758205966960
139758194625352
139758206001808
139758205966960
139758194625352
139758206001808
139758205966960
139758194625352
Out[41]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [42]: test2()
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
Out[42]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这篇关于Python串联与列表上的追加速度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!