检查是否在dict或try / except中在python中具有更好的性能?

use*_*108 5 python dictionary

我有一些包含相似数据的字典。

大多数查询将通过一次搜索一个词典来解决。

那么,在性能上明智的做法是,不对dict中是否存在键进行初步检查,而尝试在except子句中捕获键错误的下一个dict上尝试呢?

或者像

# d1, d2, d3 = bunch of dictionaries

value = d1.get(key, d2.get(key, d3.get(key, 0)))
Run Code Online (Sandbox Code Playgroud)

Abh*_*jit 6

似乎在几乎所有情况下,使用get都会更快。这是我使用try..except和获取的测试运行

>>> def foo1(n):
    spam = dict(zip(range(-99,100,n),[1]*200))
    s = 0
    for e in range(1,100):
        try:
            s += spam[e]
        except KeyError:
            try:
                s += spam[-e]
            except KeyError:
                s += 0
    return s

>>> def foo2(n):
    spam = dict(zip(range(-99,100,n),[1]*200))
    s = 0
    for e in range(1,100):
        s += spam.get(e, spam.get(-e,0))
    return s


>>> for i in range(1,201,10):
    res1 =  timeit.timeit('foo1({})'.format(i), setup = "from __main__ import foo1", number=1000)
    res2 =  timeit.timeit('foo2({})'.format(i), setup = "from __main__ import foo2", number=1000)
    print "{:^5}{:10.5}{:10.5}{:^10}{:^10}".format(i,res1,res2,foo1(i),foo2(i))


  1    0.075102  0.082862    99        99    
 11     0.25096  0.054272    9         9     
 21      0.2885  0.051398    10        10    
 31     0.26211  0.060171    7         7     
 41     0.26653  0.053595    5         5     
 51      0.2609  0.052511    4         4     
 61      0.2686  0.052792    4         4     
 71     0.26645  0.049901    3         3     
 81     0.26351  0.051275    3         3     
 91     0.26939  0.051192    3         3     
 101      0.264  0.049924    2         2     
 111     0.2648  0.049875    2         2     
 121    0.26644  0.049151    2         2     
 131    0.26417  0.048806    2         2     
 141    0.26418  0.050543    2         2     
 151    0.26585  0.049787    2         2     
 161    0.26663  0.051136    2         2     
 171    0.26549  0.048601    2         2     
 181    0.26425  0.050964    2         2     
 191     0.2648  0.048734    2         2     
>>>
Run Code Online (Sandbox Code Playgroud)


ric*_*ier 4

取决于字典中的键。

如果您确信密钥丢失的情况更常见,请使用 get。

如果您有信心预测键在那里更常见,请使用 try except。

  • 请提供支持证据,证明“dict”根据是否存在密钥而引发“KeyError”的行为变化。 (2认同)