【问题标题】:Most efficient way to remove last element of list?删除列表最后一个元素的最有效方法?
【发布时间】:2019-06-03 06:12:05
【问题描述】:

对于列表:[-1, 0, 43, 128, 32],有几种方法可以删除最后一个元素。

  • list.pop()
  • list = list[:-1](不推荐?)
  • del list[-1]
  • 可能还有更多...

它们都会返回[-1, 0, 43, 128],但是什么是计算密集度最低的,它有什么不同吗?我知道像timeit 这样的模块,我可以用它来为自己测试。但我对不受控制的变量保持警惕,我的非专业知识肯定会削弱结果。同样,字符串、浮点数或布尔值的最佳选择是否不同?多维列表呢?

我不太确定如何控制和测试这些变量,所以我想我会在这里询问是否存在一般层次结构。

不是Difference between del, remove and pop on lists 的重复项

该问题解释了删除方法之间的差异,但没有解决切片问题。它也根本没有解决速度问题。接受的答案模糊地提到了效率,我认为这是解决方案的一部分,但我看不出它如何适合切片。

【问题讨论】:

  • @Mike 那个链接说poping 是固定的,但是切片会随着列表的长度而缩放?至于平均测试它们,如果我有时间,我可能会在一两个小时内完成。
  • timeit 模块旨在执行此类测试。你试过了吗?特别是 IPython 控制台中的 %timeit 命令使其非常简单。
  • @Mike,啊,第二个答案。我现在看到了!谢谢!

标签: python python-3.x list optimization


【解决方案1】:

Python wiki 中所述。时间复杂度如下:

  • 弹出最后一个O(1)
  • 删除项目O(n)
  • 设置切片O(k+n)

实验研究

import time

all_t = 0.
for i in range(1000):
    list_ = [i for i in range(100000)]
    start_ = time.time()
    list_.pop()
    all_t += time.time() - start_
print("Average Time for POP is {}".format(all_t/1000.))

all_t = 0.
for i in range(1000):
    list_ = [i for i in range(100000)]
    start_ = time.time()
    del list_[-1]
    all_t += time.time() - start_
print("Average Time for DEL is {}".format(all_t/1000.))

all_t = 0.
for i in range(1000):
    list_ = [i for i in range(100000)]
    start_ = time.time()
    list_ = list_[:-1]
    all_t += time.time() - start_
print("Average Time for SLICE is {}".format(all_t/1000.))

结果

Average Time for POP is 7.793903350830078e-07
Average Time for DEL is 9.80854034423828e-07
Average Time for SLICE is 0.0006206443309783935

总结

pop() 在不指定索引时最快。

【讨论】:

  • @HaleemurAli 怎么样,前两种方法的末尾有e-07。但是,我在删除if-statements 后重复了它,以避免任何混淆,以防if-statements 可能导致任何滞后。不过,结果还是一样。
  • del 通常是 O(n),就像带有显式参数的 pop 一样。正如您的实验所证实的那样,del list[-1] 不会比 pop() 慢很多。
猜你喜欢
  • 2011-06-27
  • 2016-02-11
  • 2012-01-11
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多