python3:用程式碼證明dict比list快(就像飛機和蝸牛)
阿新 • • 發佈:2018-11-09
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 的速度變的更緩慢了.
原理是雜湊演算法 下一章我會寫. 希望大家關注我下,將會第一時間收到更新訊息.