pop、del、remove在运行时的区别

Difference between pop, del, and remove in runtime

我构建了一个小测试来查看 pop、del 和 remove 之间的 运行time 是否有差异。我预计 remove 和 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

如您所见,删除更糟糕(正如预期的那样),但弹出比删除慢大约 50%-60%(取决于 运行)。

这是为什么? (我尝试搜索它(我猜它是实现),但找不到原因。可能是我写的原因?)

通过此 post 中的评论之一到已接受的 answer 它说 pop 被转换为函数调用,而 del 充当原语,这就是为什么 pop 比删除

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

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

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