Python 中list ,set,dict的大规模查找效率
'''
查找效率: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慢,不过差别不大。
原文链接:https://blog.csdn.net/jmh1996/article/details/78481365
set()
因为每存一个值到set里时, 都要先经过hash,然后通过得出的这个hash值算出应该存在set里的哪个位置,存的时候会先检查那个位置上有没有值
,有的话就对比是否相等,如果相等,则不再存储此值。 如果不相等(即为空),则把新值 存在这。
链接:https://www.jianshu.com/p/70c98a096488
数据结构:
list: 线性链表
dict: hash算法
'''
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
…