Python dict和set的实现原理

  在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

相关文章
相关标签/搜索