• 查询set、dict、dict.keys()的速度对比


    查找效率:set>dict>list

    单次查询中:

    list set dict
    O(n)

    set做了去重,本质应该一颗红黑树

    (猜测,STL就是红黑树),复杂度

    O(logn);

    dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找,

    其查找复杂其实是O(logn),并不是所谓的O(1)。

    O(1)只是理想的实现,实际上很多hash的实现是进行了离散化的。

    dict比set多了一步hash的过程,so 它比set慢,不过差别不大。

    那么为什么dict.keys()查询速度比另外dict,set慢很多呢?这就要对比list、dict、set三种的数据结构了。
    [1]dict.keys()实际上是list(keys),是dict的所有key组成的list。查找一个元素是否在list中是以list的下标为索引遍历list.

    [2]而查询是否在dict中,是将key以hash值的形式直接找到key对应的索引,根据索引可直接访问value。对量大的dict查询,自然是后者快很多。

    [3]而set和dict的存储原理基本是一样的,唯一不同的是,set没有value,只有key。对查询key是否在dict或sset内,效果基本上是一样的。

    由此,可以得出,如果存储的数据会被反复查询,且量大,那么,尽量不要用list,尽量用dict,如果元素不重复,用set更好。查询是否在dict内,也不要再用dict.keys()了

    关于dcit有几点需要特别注意:

    • dict的key或者set的值 都必须是可以hash的不可变对象都是可hash的,str,fronzenset,tuple,自己实现的类 hash
    • dict的内存花销大,但是查询速度快, 自定义的对象 或者python内部的对象都是用dict包装的
    • dict的存储顺序和元素添加顺序有关
    • 添加数据有可能改变已有数据的顺序

     

  • 相关阅读:
    HTTP && 缓存
    querySelector $() getElementBy区别
    Canvas 雾玻璃
    Github page
    Browserify
    关于布局和结构
    how to install flash
    kali update can’t found win7 loader
    arp spoofing
    How To Set Up Port Forwarding in Linux
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/10006563.html
Copyright © 2020-2023  润新知