【问题标题】:Difference between pop, del, and remove in runtime运行时pop、del和remove的区别
【发布时间】:2015-03-29 21:35:16
【问题描述】:

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

如您所见,remove 比预期的要差得多(如预期的那样),但 pop 比 del 慢约 50%-60%(取决于运行)。

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

【问题讨论】:

  • pop() 返回元素,而 del 只是将其删除...可能解释其中的区别吗?
  • @mguijarr 我不知道是不是这样。我扔了元素(不要保存它,以免在循环中浪费时间)所以弹出操作(在我的测试中)就像删除一样。
  • del 是一个语句,pop 是一个方法,就像 remove 一样
  • 你的计时方法也有点可疑,如果要准确计时码那就用timeit模块
  • @PadraicCunningham 我不知道。谢谢,我会检查那个模块。

标签: python runtime


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这篇文章中的一位 cmets 访问了已接受的 answer,它说 pop 被转换为函数调用,而 del 充当原语,这就是为什么 pop 比 del 慢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-29
      • 2020-10-27
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多