亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么“try ... except KeyError ...”比“dict.get”慢?

為什么“try ... except KeyError ...”比“dict.get”慢?

絕地無雙 2023-01-04 16:05:10
很久以前,有人告訴我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”,這可能是您想要的,但通常不是。


查看完整回答
反對 回復 2023-01-04
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號