在python的dict中間進行查找某個key操做時,查找所需時間不會隨着dict中鍵值對數量增多而變長,(時間複雜度爲O(1))可是list中就會(時間複雜度爲O(N)),這是由於list查詢實現的方式是循環遍歷全部列表,而後查找對應的元素,因此列表中元素越多,查找越費時間,可是同一個dict中的全部key的id在內存中是連續的,而且其數據的存儲方式爲hash表的形式,原理圖以下:python
如上左圖,在存數dict的時候,首先會根據dict的key進行hash映射到對應的表元,而後再對應的表元中開闢內存,存入數據,當若是存在不一樣的兩個key的hash結果相同的時候,就會使用散列值的另外一部分來定位散列表中的另外一行。對象
如上右圖,在dict中查找指定的key時,會先計算key的散列值,而後使用散列值的一部分來定位表元,若是沒有找到相應的表元,則說明dict中不存在對應的key跑出KeyError異常。若是找到表元以後,會判斷表元中的key是否和要查找的key相等,相等就返回對應值,若是不相等則使用其對應的散列值的其餘部分來定位散列表中的其餘行。(這是由於不一樣的對象經過的散列值有必定的機率相同,這也是爲何在存放dict時開闢內存時候須要有1/3的空地址出來,這樣若是有相同的hash值就會有空的地址來存放隨數據增長,還會繼續開闢新的內存,以確保空內存時刻在1/3左右)blog
補充:①python中set的值得存儲方式也是和dict同樣。因此dict的key和set的值都必須是可hash(即不可修改的)的對象。內存
②dict的花銷大,由於會空出進1/3的內存主來,可是查詢速度快。hash