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()
我构建了一个小测试来查看 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()