版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83688536
dict 速度快的原因是应用的哈希算法,是直接匹配的方式,list需要遍历,当数据量大的时候dict 占优势.
哈希还有一个好处就是不会随着数据量变大而变慢.
下边我用一段代码证明.有不明白的地方要看我的注释.
from random import randint
def load_list_data(total_nums, target_nums):
"""
从文件中读取数据,以list的方式返回
:param total_nums: 读取的数量
:param target_nums: 需要查询的数据的数量
"""
all_data = []
target_data = []
file_name = "C:/works/perform.txt" #这个文件可以自己准备下,line要足够大
with open(file_name, mode="r") as f_open:
for count, line in enumerate(f_open): #应用的是 enumerate 函数 ,
它很高级他会给你主动添加下标,并把指对应.
count 是下标,line是读取的值
if count < total_nums: #文件的行数一定要小于传入的最大值,不然会引起后边报错,
line=line+str(count) #这个目的把下标加入line里面,
#由于我准备的行文字是重复的,所以加个下标区分下
all_data.append(line) #调用append方法,抓取all_data大家都知道什么意思
else:
break
for x in range(target_nums): #循环的次数等于传入的需要匹配数量
random_index = randint(0, total_nums) # 随机取index
if all_data[random_index] not in target_data:
target_data.append(all_data[random_index])
if len(target_data) == target_nums: #这两个if语句都是抓取target数量的line
break
return all_data, target_data
def load_dict_data(total_nums, target_nums):
"""
从文件中读取数据,以dict的方式返回
:param total_nums: 读取的数量
:param target_nums: 需要查询的数据的数量
"""
all_data = {}
target_data = []
file_name = "C:/works/perform.txt"
with open(file_name, mode="r") as f_open:
for count, line in enumerate(f_open):
if count < total_nums:
line=line+str(count)
all_data[line] = 0
else:
break
all_data_list = list(all_data)
for x in range(target_nums):
random_index = randint(0, total_nums -1)
if all_data_list[random_index] not in target_data:
target_data.append(all_data_list[random_index])
if len(target_data) == target_nums:
break
return all_data, target_data
def find_test(all_data, target_data):
# 测试运行时间
test_times = 100 #测试的次数
total_times = 0
import time
for i in range(test_times): #用测试次数进行循环
find = 0
start_time = time.time() #定位开始时间
for data in target_data: #循环target data
if data in all_data: #拿target data 每个值都要去库查询
find += 1
last_time = time.time() - start_time #计算每次用的时间
total_times += last_time #把每次用的时间累加
return total_times /test_times #求平均数
if __name__ == "__main__":
#all_data, target_data = load_list_data(1000, 100)
# all_data, target_data = load_list_data(100000, 1000)
#all_data, target_data = load_list_data(10000, 1000)
#传入 total_nums, target_nums抓取数据 ,包括all data and target data
#all_data, target_data = load_dict_data(1000, 1)
#all_data, target_data = load_dict_data(100000, 1000)
all_data, target_data = load_dict_data(10000, 1000)
last_time = find_test(all_data, target_data) #调用测试时间方法.
print(last_time)
上边的代码核心就是计算数据查找消耗的时间.也不是很难. 下边我们一起见证
奇迹 ,运行我们代码.
先运行list :
all_data, target_data = load_list_data(10000, 1000)
打印结果;
0.09826071500778198
速度还是可以的,不是很慢,然后我们用dict运行下
all_data, target_data = load_dict_data(10000, 1000)
打印结果:
0.00014509677886962892
我的乖乖,自己对比下 速度不比不知道,惊人呀.
我们继续把库增大点,如下
all_data, target_data = load_dict_data(100000, 1000) # 从10000变成 100000
看结果如下:
0.00012506723403930665
通过结果我们发现并没有任何影响.如果增加dict 的,自己试一试.结论是
dict 的速度变的更缓慢了.
原理是哈希算法 下一章我会写. 希望大家关注我下,将会第一时间收到更新消息.