这是更有效的dict.get(“ 1”,“ default val”)或其他检查

时间:2019-03-01 08:56:52

标签: python

我有字典

my_dict  = {
        "1": "sss", "2": "dddd", "3": "ssss",
        "4": "ccc", "5": "aaa", "6": "ffff"
        }

在时间复杂度方面哪个更有效?

myvar = my_dict.get("7", "default value")

OR

if "7" in  my_dict :
     myvar = my_dict["7"]
else:
    myvar = "default value"

两者都不一样,因为在dict.get的实现中,如果存在else条件,然后返回默认值?

2 个答案:

答案 0 :(得分:1)

这是两者的比较

d = {str(k): k**2 for k in range(10000)}
In[85]: def check(d):
   ...:     if '899' in d:
   ...:         return d['899']
   ...:     else:
   ...:         return "None"
   ...:     

n[86]: %timeit check(d)
102 ns ± 0.875 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In[87]: %timeit d.get('899', 'None')
62.1 ns ± 0.282 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

答案 1 :(得分:1)

如果您追求速度,则else方法的工作速度会稍快一些。发生这种轻微的差异是因为,

  1. get是一个属性,因此Python必须查找它,然后将找到的描述符绑定到字典实例。
  2. ()是一个调用,因此必须将当前帧压入堆栈,必须进行调用,然后再次从堆栈中弹出该帧以继续。
import time

print("++++++++++Small Dict++++++++++++")

my_dict  = {
        "1": "sss", "2": "dddd", "3": "ssss",
        "4": "ccc", "5": "aaa", "6": "ffff"
        }

start = time.time()
myvar = my_dict.get("7", "default value")
print("myvar: ", myvar)
print("Time taken for get method: ", time.time() - start)

start = time.time()
if "7" in  my_dict :
     myvar = my_dict["7"]
else:
    myvar = "default value"
print("myvar: ", myvar)
print("Time taken for else method: ", time.time() - start)

print("++++++++++Big Dict++++++++++++")

for i in range(10000):
    my_dict[str(i)] = str(i)

start = time.time()
myvar = my_dict.get("100000000", "default value")
print("myvar: ", myvar)
print("Time taken for get method: ", time.time() - start)

start = time.time()
if "100000000" in  my_dict :
     myvar = my_dict["7"]
else:
    myvar = "default value"
print("myvar: ", myvar)
print("Time taken for else method: ", time.time() - start)

输出

++++++++++Small Dict++++++++++++
myvar:  default value
Time taken for get method:  8.821487426757812e-06
myvar:  default value
Time taken for else method:  7.152557373046875e-06
++++++++++Big Dict++++++++++++
myvar:  default value
Time taken for get method:  3.62396240234375e-05
myvar:  default value
Time taken for else method:  8.106231689453125e-06
相关问题