小白一枚,有错请指正,勿喷
python列表删除元素的三个方法:del、pop、remove用法和区别都看明白了,那么问题来了,到底怎么选,排除其他各种目的,我只从效率角度思考,所以写了一段无聊至极的代码(在列表、元组、字典里面,一边循环一遍删除是不对滴,这里只是为了测试效率),以比较三种方法效率高低,用中文来说是生成一个10万个元素的列表,分别用del、pop、remove三种方法把10万个元素逐个移除掉,记录耗时。
经过一轮不那么激烈的战斗,效率排序如下:pop>del>remove。
思考:
1.pop和del都是通过列表索引操作的,比remove通过找元素的方式来说,效率高的不是一个水平级别,remove绝对完败
2.pop和del两个的差距不是特别明显,(当然再放大数量等级会更明显,为了迁就remove只能采用10万测试),稍稍理解一下,pop在默认参数情况下,直接从列表尾巴移除,我已经特意把del的删除顺序,按索引从大到小的排序进行(即从尾巴开始移除),如果是从列表开头开始删除,还涉及大量拷贝应该会更慢。
3.pop和del还有一个差异,pop是不生成新对象的,del每次循环生成一个新对象,因此也造成效率降低。
从代码效率角度出发,应该注意以下方面:
1.尽量用“索引”而不是“值”进行操作
2.尽量避免生成新对象,一旦循环次数增加,增加新对象会造成效率下降
3.尽量在列表尾巴进行操作,不要从中间操作,元组、字典同理
代码如下,如有兴趣可以复制ide试试
import time
print('{0:=^20}'.format('del方法'))
time1=time.time()
a=list(range(100000))
for i in range(100000,0,-1):
del a[i-1]
time2=time.time()
print('{0}用时:{1}'.format('del方法',time2-time1))
print()
print()
print('{0:=^20}'.format('pop方法'))
time1=time.time()
a=list(range(100000))
for i in range(100000):
a.pop()
time2=time.time()
print('{0}用时:{1}'.format('pop方法',time2-time1))
print()
print()
print('{0:=^20}'.format('remove方法'))
time1=time.time()
a=list(range(100000))
for i in range(100000):
a.remove(i)
time2=time.time()
print('{0}用时:{1}'.format('remove方法',time2-time1))
While True:
learn()