python 2.7最快的dict访问丢失键

时间:2014-10-22 11:41:43

标签: python python-2.7 dictionary

如果d是dict,python docs为我们提供了这个方法:

dict.get = get(...)
    D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.

另一个着名的模式是:

try:
    D[k]:
except:
    d

但是在我的基准测试中(使用timeit完成),我发现以下方法是最好的:

if k in D:
    D[k]
else:
    d

如果没有引发异常,则try / except模式是最快的,但如果没有引发异常,那么我们就不需要这种模式。我现在需要重构我的所有代码,这些代码是用很多.get()编写的,因为我需要在有限的系统上挤压一些性能。我是对还是错?为什么看起来它是最慢的尝试/除外模式?

2 个答案:

答案 0 :(得分:1)

看起来D[k] if k in D else d模式比.get快两倍,至少对于某些用途而言。

。获得

$ python -m timeit -s 'D={}; k=xrange(0,100000)' 'D.get(k)'
10000000 loops, best of 3: 0.0934 usec per loop

的if / else

$ python -m timeit -s 'D={}; k=xrange(0,100000)' 'D[k] if k in D else None'
10000000 loops, best of 3: 0.0487 usec per loop

答案 1 :(得分:0)

也许您应该尝试pypy并在嵌入式系统上进行编译。 if-then-elseget有类似的结果。一些基准:

PyPy:

$ pypy3 -m timeit -s 'd={}; k=0' 'd[k] if k in d else None'
1000000000 loops, best of 3: 0.0008 usec per loop
$ pypy3 -m timeit -s 'd={}; k=0' 'd.get(k)'                
1000000000 loops, best of 3: 0.000803 usec per loop

Python 3:

$ python -m timeit -s 'd={}; k=0' 'd.get(k)'                                                                                                                                                     1 ↵
10000000 loops, best of 3: 0.101 usec per loop
$ python -m timeit -s 'd={}; k=0' 'd[k] if k in d else 0'     
10000000 loops, best of 3: 0.0372 usec per loop