运行时pop,del和remove之间的区别

时间:2015-03-29 21:35:17

标签: python runtime

我构建了一个小测试,看看pop,del和remove之间的运行时是否存在差异。我期望删除和pop / del之间的区别,因为删除搜索值并删除它,并弹出/删除索引。

测试:

import time
list1 = []
list2 = []
list3 = []

for num in xrange(100000):
    list1.append(num)
    list2.append(num)
    list3.append(num)

print len(list1)
ticks = time.time()
for num in xrange(100000):
    list1.pop()

print "list 1 is over", list1
print time.time() - ticks
print "------------------------------------------"

print len(list2)
ticks = time.time()
for num in xrange(99999, -1, -1):
    del list2[num]

print "list 2 is over", list2
print time.time() - ticks
print "------------------------------------------"

print len(list3)
ticks = time.time()
for num in xrange(0,100000):
    list3.remove(num)

print "list 3 is over", list3
print time.time() - ticks

结果是:

100000
list 1 is over []
0.0269999504089
------------------------------------------
100000
list 2 is over []
0.0169999599457
------------------------------------------
100000
list 3 is over []
2.55900001526

正如你所看到的,删除更糟糕(正如预期的那样),但是弹出速度比del大约50%-60%(取决于运行速度)慢。

为什么? (我尝试搜索它(我猜它是实现),但找不到原因。也许原因在于我是如何写的?)

2 个答案:

答案 0 :(得分:5)

将这篇文章中的一条评论发送到接受的answer,它表示pop会被转换为函数调用,而del则充当原语,这就是为什么pop与del相比较慢的原因

答案 1 :(得分:0)

函数调用属性名称查找+绑定方法初始化在Python中很慢。在pop情况下,list1.pop的重复查找会对查找进行属性查找,并为每个循环创建一个新的绑定方法对象,而del只调用__delitem__魔术方法。在一个插槽中。

通过将方法查找移出循环,可以使第二个更快:

pop = list1.pop
for num in xrange(100000):
    pop()