很久以前,有人告訴我d = {}try: a = d['a'] # do somethingexcept KeyError: # do something else比a = d.get('a')if a: # do somethingelse: # do something else但是今天,我做了一個簡單的測試后,發現結果恰恰相反: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那為什么會這樣呢?在我的想象中,d.get也應該做類似的判斷鍵是否存在于dict中的邏輯。
1 回答

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