当前位置 主页 > 网站技术 > 代码类 >

    Python 中list ,set,dict的大规模查找效率对比详解

    栏目:代码类 时间:2019-10-11 15:03

    很多时候我们可能要频繁的进行元素的find 或in操作,本人一直天真的以为python的list做了hash,通过红黑树来高效查找···直到今天我真正来测试它和set,dict的查找效率时,才发现自已想太多了!!!!

    先看代码:

    __author__ = 'jmh081701'
    import numpy
    import time
    l=[]
    sl=set()
    dl=dict()
    r=numpy.random.randint(0,10000000,100000)
    for i in range(0,100000):
      l.append(r[i])
      sl.add(r[i])
      dl.setdefault(r[i],1)
    #生成3种数据结构供查找,常规的list,集合sl,字典dl.里面的元素都是随机生成的,为什么要随机生成元素?这是防止某些结构对有序数据的偏向导致测试效果不客观。
    
    start=time.clock()
    for i in range(100000):
      t=i in sl
    end=time.clock()
    print("set:",end-start)
    #计算通过set来查找的效率
    start=time.clock()
    for i in range(100000):
      t=i in dl
    end=time.clock()
    print("dict:",end-start)
    #计算通过dict的效率
    start=time.clock()
    for i in range(100000):
      t=i in l
    end=time.clock()
    print("list:",end-start)
    #计算通过list的效率

    结果:

    set: 0.01762632617301519
    dict: 0.021149536796960248
    ······
    ···
    ··

    呵呵呵呵···list等了20分钟都没出结果。

    所以···结果一览无余啊。

    查找效率:set>dict>list

    单次查询中:看来list 就是O(n)的;而set做了去重,本质应该一颗红黑树(猜测,STL就是红黑树),复杂度O(logn);dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找,其查找复杂其实是O(logn),并不是所谓的O(1)。O(1)只是理想的实现,实际上很多hash的实现是进行了离散化的。dict比set多了一步hash的过程,so 它比set慢,不过差别不大。

    so,如果是要频繁的查找,请使用set吧!

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持IIS7站长之家。