python字典按key取值_Python 字典中key命中取值的两种方法性能比较!

起步

从字典中取值有两个方法,一个是先判断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 操作吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值