天天看點

python3:用代碼證明dict比list快(就像飛機和蝸牛)

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 的速度變的更緩慢了.

原理是雜湊演算法 下一章我會寫. 希望大家關注我下,将會第一時間收到更新消息.