在Python中,写作之间是否存在差异(比如性能)
L.append(x)
和
L[len(L):len(L)] = [x]
其中L
是一个列表?如果有,它是由什么造成的?
谢谢!
答案 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)]
是非常的。这是最大的性能损失:我的大脑需要花时间弄清楚它刚才看到了什么。 : - )