删除列表的最后一个元素的最有效方法?

时间:2019-06-02 21:28:29

标签: python python-3.x list optimization

对于列表[-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的重复项

该问题解释了删除方法之间的差异,但未解决切片问题。它也根本不解决速度问题。公认的答案模糊地提到了效率,我认为它是解决方案的一部分,但我看不到它与切片如何匹配。

1 个答案:

答案 0 :(得分:4)

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()最快。