Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中字典键查找的性能如何比较?_Python_Performance - Fatal编程技术网

Python中字典键查找的性能如何比较?

Python中字典键查找的性能如何比较?,python,performance,Python,Performance,如何: dict = {} if key not in dict: dict[key] = foo 与之相比: try: dict[key] except KeyError: dict[key] = foo 也就是说,在中查找键是否比通过dict.keys()进行线性搜索快,我假设第一种形式就可以了?my\u dict.get(key,foo)如果键不在my\u dict中,则返回foo。默认值为None,因此my\u dict.get(key)如果关键字不在my_dict中,则将返

如何:

dict = {}
if key not in dict:
 dict[key] = foo
与之相比:

try:
 dict[key]
except KeyError:
 dict[key] = foo 

也就是说,在中查找键是否比通过
dict.keys()
进行线性搜索快,我假设第一种形式就可以了?

my\u dict.get(key,foo)
如果键不在my\u dict中,则返回foo。默认值为None,因此
my\u dict.get(key)
如果关键字不在my_dict中,则将返回None。如果只想将关键字添加到字典中,则第一个选项会更好。这里不要担心速度。如果您发现填充词典是程序中的一个热点,那么请考虑一下。但事实并非如此。所以不要这样做。

试试:
my_dict.setdefault(key,default)
。不过,它比其他选项稍微慢一点

如果字典中有
,则返回其值。如果没有,请插入值为
default
,然后返回
default
<代码>默认值默认为无


您正在查找setdefault方法:

>>> r = {}
>>> r.setdefault('a', 'b')
'b'
>>> r
{'a': 'b'}
>>> r.setdefault('a', 'e')
'b'
>>> r
{'a': 'b'}

只需澄清一点:
如果键不在d中
不会通过d的键进行线性搜索。它使用dict的哈希表快速找到密钥。

答案取决于密钥已经在dict中的频率(顺便问一下,有没有人向您提到过在变量后面隐藏一个内置项(如
dict
)有多糟糕?)

如果键在字典中,则执行一次字典查找。如果钥匙在字典里,它会查字典两次

try:
 dct[key]
except KeyError:
 dct[key] = foo 
对于键在字典中的情况,这可能会稍微快一点,但是抛出异常会有相当大的开销,因此它几乎总是不是最好的选择

dct.setdefault(key, foo)
这个有点棘手:它总是涉及两个字典查找:第一个是在
dict
类中查找
setdefault
方法,第二个是在
dct
对象中查找
key
。此外,如果
foo
是一个表达式,则每次都将对其求值,而之前的选项仅在必要时对其求值


另请查看
collections.defaultdict
。这是适用于此类大类情况的最合适的解决方案。

还有dict.setdefault方法:第一种方法不进行线性搜索。正如拉里·沃尔(Larry Wall)所说:“对关联数组进行线性扫描就像试图用加载的Uzi将某人打死。”
dict.\uuuu包含的内容与
dict.\uuu getitem\uuuu
的前2/3大致相同。(散列查找)。如果不是通过查看他的代码设置的,则不会设置该值。他似乎在检查该键是否存在,并将其设置为其他值。@GWW:True。你可以使用dict[key]=dict.get(key,foo)
,我想是的,但是为什么不直接使用dict.setdefault(key,value)呢?这是完全错误的。你有没有试过做一件叫做“阅读文档”的事情?很有意思的是python内置方法的速度要慢得多。我想是函数调用开销。有趣的是,使用
psyco.full()
,这三种变体只占用大约10%的时间。感谢您提供的计时数据!我还测试了collections.defaultdict,发现它的性能比setdefault好,但比kn和te差。使用“dict”的好处是我在键入示例时更改了变量名,没有考虑它。密钥通常不在dict中。我将使用collections.defaultdict,感谢您指出这一点。它看起来像蟒蛇,而且比dict.setdefault()快一根头发很常见地看到dict={},str=“something”。。。覆盖内置关键字。有些语言不允许这样。这正是我想知道的——ta!
try:
 dct[key]
except KeyError:
 dct[key] = foo 
dct.setdefault(key, foo)