L.append(x)vs L [len(L):len(L)] = [x]

时间:2014-01-27 15:50:05

标签: python list

在Python中,写作之间是否存在差异(比如性能)

L.append(x)

L[len(L):len(L)] = [x]

其中L是一个列表?如果有,它是由什么造成的?

谢谢!

3 个答案:

答案 0 :(得分:1)

除了append方法之外,你可以使用insert将元素追加到列表中,我猜这是你所指的:

In [115]: l=[1,]

In [116]: l.insert(len(l), 11)

In [117]: l
Out[117]: [1, 11]

l.append(x)vs. l.insert(len(l),x):

In [166]: %timeit -n1000    l=[1]; l.append(11)
1000 loops, best of 3: 936 ns per loop

In [167]: %timeit -n1000    l=[1]; l.insert(len(l), 11)
1000 loops, best of 3: 1.44 us per loop

很明显,方法append更好。

然后 L.append(x)vs L [len(L):len(L)] = [x]

L[len(L):]=[x]

In [145]: %timeit -n1000        l=[1]; l.append(123);
1000 loops, best of 3: 878 ns per loop

In [146]: %timeit -n1000        l=[1]; l[len(l):]=[123]
1000 loops, best of 3: 1.24 us per loop

In [147]: %timeit -n1000        l=[1]; l[len(l):len(l)]=[123]
1000 loops, best of 3: 1.46 us per loop

答案 1 :(得分:0)

我的系统没有任何区别......

In [22]: f = (4,)

In [21]: %timeit l = [1,2,3]; l.append(4)
1000000 loops, best of 3: 265 ns per loop

In [23]: %timeit l = [1,2,3]; l.append(f)
1000000 loops, best of 3: 266 ns per loop

In [24]: %timeit l = [1,2,3]; l.extend(f)
1000000 loops, best of 3: 270 ns per loop

In [25]: %timeit l = [1,2,3]; l[4:] = f
1000000 loops, best of 3: 260 ns per loop

这意味着在苹果对苹果的比较中,它们是相同的(上述差异可能小于随机误差)。

但是,任何额外的(例如必须在该版本中计算len)可能会使某些特定实现的结果出现偏差。

答案 2 :(得分:0)

与往常一样,性能测试存在缺陷。但在你的例子中:

x不一定是可迭代的,你可以在迭代中包装它。这显然是一个额外的步骤,会导致性能下降。

执行len(L)不是免费的,需要非零时间。这也会导致性能下降。

一些快速测试证实了这一点:

def f():
    a = []
    for i in range(10000):
        a.append(0)


def g():
    a = []
    for i in range(10000):
        a[len(a):len(a)] = [0]


%timeit f()
1000 loops, best of 3: 683 us per loop

%timeit g()
100 loops, best of 3: 2.4 ms per loop

现在,您可以执行的一项非显而易见的“优化”删除len(L)效果是使用一个高于列表长度的常量切片。扩展切片永远不会抛出IndexError,即使你已经离开了迭代的末尾。让我们这样做。

def h():
    a = []
    for i in range(10000):
        a[11111:11111] = [0]


%timeit h()
1000 loops, best of 3: 1.45 ms per loop

正如所怀疑的那样,将x包裹在一个可迭代的内容中并且调用len都会产生小的但有形的性能损失。


当然,做li[len(li):len(li)]是非常的。这是最大的性能损失:我的大脑需要花时间弄清楚它刚才看到了什么。 : - )