这是更高效的dict.get(“1”,“默认值”)或if else检查

问题描述 投票:-1回答:2

我有口才

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

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

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

要么

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

是不是它们都是相同的,因为在执行dict.get时会有if else条件然后返回默认值?

python
2个回答
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

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)
© www.soinside.com 2019 - 2024. All rights reserved.