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