Python 从DICT中删除元素时,首选del还是pop

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稍微

我对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
稍微慢一点。一位同事接着指出,
del
可能仍然具有优势,因为它是一个关键字,因此可能会得到更好的优化,而
pop
是一种可以被最终用户取代的方法(不确定这是否真的是一个因素,但他在编写Python代码方面有更多的经验)

我编写了几个测试片段来比较性能。看起来,
del
具有优势(如果有人愿意尝试这些代码片段或对其正确性进行评论,我会添加这些代码片段)

因此,这让我回到了问题:除了边际性能增益之外,是否有理由选择一个而不是另一个

以下是测试性能的代码段:

幼稚试验 这个输出

in:    0.0521960258484
pop:   0.172810077667
del:   0.0660231113434
所以这是一个奇怪的结果。在中,我希望 POP与<>代码大致相同,但它的价格是昂贵的三倍以上。另一个惊喜是
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
vs
pop
的真正原因是它们有不同的行为
pop
返回弹出键的值,因此如果要在删除该值的同时使用该值,可以使用
pop
。如果您不需要对该值执行任何操作,只想删除该项,请使用
del

pop
速度较慢,原因有二:它需要返回一个值,并且每次访问都需要对
pop
名称进行名称查找。谢谢@AnttiHaapala。