如果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()编写的,因为我需要在有限的系统上挤压一些性能。我是对还是错?为什么看起来它是最慢的尝试/除外模式?
答案 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-else
和get
有类似的结果。一些基准:
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