代码之家  ›  专栏  ›  技术社区  ›  Aaron McMillin

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

  •  5
  • Aaron McMillin  · 技术社区  · 15 年前

    如何:

    dict = {}
    if key not in dict:
     dict[key] = foo
    

    比较:

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

    dict.keys()

    5 回复  |  直到 15 年前
        1
  •  4
  •   Duncan    15 年前

    答案取决于密钥已经在dict中的频率(顺便说一句,是否有人向您提到过隐藏一个内置的 dict 变量后面?)

    if key not in dct:
     dct[key] = foo
    

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

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

    对于键在字典中的情况,这可能会稍微快一点,但是抛出异常会有相当大的开销,因此几乎总是不是最佳选择。

    dct.setdefault(key, foo)
    

    setdefault 中的方法 口述 同学们,第二个是找 key dct 对象。如果 foo 是一个表达式,每次都将对其求值,而前面的选项仅在必要时才对其求值。

    collections.defaultdict . 对于这样的一大类情况,这是最合适的解决方案。

        2
  •  8
  •   Ned Batchelder    15 年前

    if key not in d 不会通过d键进行线性搜索。它使用dict的哈希表来快速找到密钥。

        3
  •  6
  •   Chris Adams    15 年前

    您正在查找setdefault方法:

    >>> r = {}
    >>> r.setdefault('a', 'b')
    'b'
    >>> r
    {'a': 'b'}
    >>> r.setdefault('a', 'e')
    'b'
    >>> r
    {'a': 'b'}
    
        4
  •  4
  •   miku    15 年前

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

    如果 key 钥匙 值为 default 然后回来 . 默认为“无”。

    #!/usr/bin/env python
    
    example_dict = dict(zip(range(10), range(10)))
    
    def kn(key, d):
        if key not in d:
            d[key] = 'foo'
    
    def te(key, d):
        try:
            d[key]
        except KeyError:
            d[key] = 'foo'
    
    def sd(key, d):
        d.setdefault(key, 'foo')
    
    if __name__ == '__main__':
        from timeit import Timer
    
        t = Timer("kn(2, example_dict)", "from __main__ import kn, example_dict")
        print t.timeit()
        t = Timer("te(2, example_dict)", "from __main__ import te, example_dict")
        print t.timeit()
        t = Timer("sd(2, example_dict)", "from __main__ import sd, example_dict")
        print t.timeit()
    
        # kn: 0.249855041504
        # te: 0.244259119034
        # sd: 0.375113964081
    
        5
  •  -1
  •   nmichaels    15 年前

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