起步
从字典中取值有两个方法,一个是先判断key是否在字典中再取值;另一个是包裹try块中直接去取值:
Python资源共享群:484031800
def use_in(d, key):
if key in d:
return d[key]
return None
def use_try(d, key):
try:
return d[key]
except KeyError:
pass
return None
性能比较
用 timeit 模块来查看它们的运行时间,测试环境 win10 + python3.6.8:
import timeit
def use_in(d, key):
if key in d:
return d[key]
return None
def use_try(d, key):
try:
return d[key]
except KeyError:
pass
return None
cache = {}
for i in range(100):
cache[i] = True
perf_dict = {
'in: hit': min(timeit.repeat(lambda: use_in(cache, 50))),
'in:not hit': min(timeit.repeat(lambda: use_in(cache, 150))),
'try: hit': min(timeit.repeat(lambda: use_try(cache, 50))),
'try:not hit': min(timeit.repeat(lambda: use_try(cache, 150))),
}
print(perf_dict)
得到结果:
{
'in: hit': 0.32121160000000004,
'in:not hit': 0.2666487000000002,
'try: hit': 0.27908409999999995,
'try:not hit': 0.5742989999999999
}
好像用 try 的方式的快一些,但当不命中的时候几乎慢了一倍多。所以平均下来这两个方法性能其实没啥区别。
标准库里会用哪种方法呢
比较好奇标准库中会用哪种方法呢?
in先判断的方式
argparse 模块中:
linecache 模块:
dummy_threading 模块:
try块的方式
re 模块中的 _compile 中:
string 模块中:
datetime 模块中:
functools 模块中:
copy 模块:
threading 模块:
更多的就不举例了,可以看到,在标准库里大多还是使用 try 块的方式。然后是一些不常用或者比较“新”的模块才用 in 判断方式。可能是早先前的字典不支持 in 操作吧。