1. 程式人生 > >python3:用程式碼證明dict比list快(就像飛機和蝸牛)

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 的速度變的更緩慢了.
原理是雜湊演算法 下一章我會寫. 希望大家關注我下,將會第一時間收到更新訊息.