Python串联与列表上的追加速度 [英] Python concatenation vs append speed on lists

查看:52
本文介绍了Python串联与列表上的追加速度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆