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