python3:用代码证明dict比list快(就像飞机和蜗牛)

版权声明:转载 或者复制请标注来源 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 的速度变的更缓慢了.
原理是哈希算法 下一章我会写. 希望大家关注我下,将会第一时间收到更新消息.

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/83688536