很久以前,有人告訴我d = {}try: a = d['a'] # do somethingexcept KeyError: # do something else比a = d.get('a')if a: # do somethingelse: # do something else但是今天,我做了一個(gè)簡單的測(cè)試后,發(fā)現(xiàn)結(jié)果恰恰相反:import timed = {}n = 0t1 = time.time()for i in range(1000000): try: a = d['a'] except KeyError: n += 1print(time.time() - t1)>>> 0.4676947593688965import timed = {}n = 0t1 = time.time()for i in range(1000000): a = d.get('a') if a is None: n += 1print(time.time() - t1)>>> 0.3045947551727295那為什么會(huì)這樣呢?在我的想象中,d.get也應(yīng)該做類似的判斷鍵是否存在于dict中的邏輯。
1 回答

MM們
TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
當(dāng)例外情況是不常見情況時(shí),您所學(xué)的規(guī)則適用。如果您通常要查找該值,那么d['a']
包裝在很少調(diào)用異常處理機(jī)制的try
/except KeyError:
中將會(huì)獲勝;如果您通常不會(huì)找到該值,則拋出和捕獲異常的開銷將超過使用泛型方法 dispatch ( d.get('a')
) 與更直接的語法支持方法 ( ) 相比更高的相對(duì)開銷d['a']
。在現(xiàn)代 (3.7+) CPython 中尤其如此,其中方法調(diào)用得到了一些額外的優(yōu)化,減少了d.get('a')
.
正如您在評(píng)論中指出的那樣,在查找成功的情況下,get
速度保持相同,而未d['a']
使用的except KeyError:
速度明顯更快。在許多情況下它也更正確;如果dict
有映射到 的鍵None
,您get
的基于 的代碼將不會(huì)區(qū)分“鍵未找到”和“鍵映射到None
”,這可能是您想要的,但通常不是。
添加回答
舉報(bào)
0/150
提交
取消