Python 从DICT中删除元素时,首选del还是pop
我对Python比较陌生,想知道在从Python 从DICT中删除元素时,首选del还是pop,python,python-2.7,Python,Python 2.7,我对Python比较陌生,想知道在从dict中删除元素时,是否有任何理由选择其中一种方法 A)使用del # d is a dict, k is a key if k in d: del k d.pop(k, None) B)使用pop # d is a dict, k is a key if k in d: del k d.pop(k, None) 我的第一个想法是,方法(A)需要进行两次查找——一次在if语句中,另一次在del的实现中,这将使它比只需要一次查找的pop稍微
dict
中删除元素时,是否有任何理由选择其中一种方法
A)使用del
# d is a dict, k is a key
if k in d:
del k
d.pop(k, None)
B)使用pop
# d is a dict, k is a key
if k in d:
del k
d.pop(k, None)
我的第一个想法是,方法(A)需要进行两次查找——一次在if
语句中,另一次在del
的实现中,这将使它比只需要一次查找的pop
稍微慢一点。一位同事接着指出,del
可能仍然具有优势,因为它是一个关键字,因此可能会得到更好的优化,而pop
是一种可以被最终用户取代的方法(不确定这是否真的是一个因素,但他在编写Python代码方面有更多的经验)
我编写了几个测试片段来比较性能。看起来,del
具有优势(如果有人愿意尝试这些代码片段或对其正确性进行评论,我会添加这些代码片段)
因此,这让我回到了问题:除了边际性能增益之外,是否有理由选择一个而不是另一个
以下是测试性能的代码段:
幼稚试验
这个输出
in: 0.0521960258484
pop: 0.172810077667
del: 0.0660231113434
所以这是一个奇怪的结果。在中,我希望del
只比中的稍微慢一点,直到我意识到timeit
类中的setup语句中的字典仍然是相同的实例,因此只有第一个调用才会命中del
语句,因为所有其他调用都不会传递if
语句
稍微不那么幼稚的测试
所以我写了一个较长的分析片段,试图避免这种情况。我运行了几个timeit
运行,并使用一些随机键选择,并尝试确保我们将主要命中if
语句和del
语句(因此我们不总是使用同一个字典实例):
进行100次设置,每次1000次运行,打印以下内容:
SETUP:
repeats : 100
runs per repeat: 1000
garbage collect: no
SMALL:
in: 0.00020430803299
pop: 0.000313355922699
del: 0.000262062549591
LARGE:
in: 0.000201721191406
pop: 0.000328607559204
del: 0.00027587890625
我不熟悉使用timeit
,因此这可能是一个有缺陷的测试,但它确实表明del
在性能方面有一点优势
我从这个练习中学到的一个困难的是Python字典是哈希映射,所以字典的大小不影响查找时间,就像它是C++的代码> STD::map < /C> >(例如,恒定时间vs O(log(n))-ISH)。哦,好吧。活到老学到老。
我不会担心性能差异,除非您有特定的理由相信它们会导致您的程序出现有意义的减速,这是不可能的
您可能选择使用del
vspop
的真正原因是它们有不同的行为pop
返回弹出键的值,因此如果要在删除该值的同时使用该值,可以使用pop
。如果您不需要对该值执行任何操作,只想删除该项,请使用del
,pop
速度较慢,原因有二:它需要返回一个值,并且每次访问都需要对pop
名称进行名称查找。谢谢@AnttiHaapala。