python dict和set的實現原理和效能

2021-08-27 13:51:54 字數 2737 閱讀 3277

from random import randint

defload_list_data

(total_nums, target_nums):

""" 從檔案中讀取資料,以list的方式返回

:param total_nums: 讀取的數量

:param target_nums: 需要查詢的資料的數量

"""all_data =

target_data =

file_name = "g:/慕課網課程/advancepython/fbobject_idnew.txt"

with open(file_name, encoding="utf8", mode="r") as f_open:

for count, line in enumerate(f_open):

if count < total_nums:

else:

break

for x in range(target_nums):

random_index = randint(0, total_nums)

if all_data[random_index] not

in target_data:

if len(target_data) == target_nums:

break

return all_data, target_data

defload_dict_data

(total_nums, target_nums):

""" 從檔案中讀取資料,以dict的方式返回

:param total_nums: 讀取的數量

:param target_nums: 需要查詢的資料的數量

"""all_data = {}

target_data =

file_name = "g:/慕課網課程/advancepython/fbobject_idnew.txt"

with open(file_name, encoding="utf8", mode="r") as f_open:

for count, line in enumerate(f_open):

if count < total_nums:

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:

if len(target_data) == target_nums:

break

return all_data, target_data

deffind_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:

if data in all_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(10000, 1000)

# all_data, target_data = load_list_data(100000, 1000)

# all_data, target_data = load_list_data(1000000, 1000)

# all_data, target_data = load_dict_data(10000, 1000)

# all_data, target_data = load_dict_data(100000, 1000)

# all_data, target_data = load_dict_data(1000000, 1000)

all_data, target_data = load_dict_data(2000000, 1000)

last_time = find_test(all_data, target_data)

#dict查詢的效能遠遠大於list

#在list中隨著list資料的增大 查詢時間會增大

#在dict中查詢元素不會隨著dict的增大而增大

print(last_time)

#1. dict的key或者set的值 都必須是可以hash的

#不可變物件 都是可hash的, str, fronzenset, tuple,自己實現的類 __hash__

#2. dict的記憶體花銷大,但是查詢速度快, 自定義的物件 或者python內部的物件都是用dict包裝的

# 3. dict的儲存順序和元素新增順序有關

# 4. 新增資料有可能改變已有資料的順序

Python dict字典的使用

為記錄學習的過程 python中 雜湊值 hash 在字典dict中 每個鍵值對的key 儲存到 記憶體中都是以雜湊值 位址值key 的方式儲存的 每次獲取相同值的雜湊值都是相等的 這樣保證了一致性 假如重啟專案 則雜湊值會發生變化 如果是數字型別的雜湊值 hash 123455 數字在python...

python dict的注意事項

1.key不能用list和set 由於列表是易變的,故不可做key。如果使用會報錯 但是元組可以做key 2.遍歷方法 for key in somedict pass 速度快,但是如果要刪除元素會導致錯誤,出錯情況如下 這裡初始化乙個dict d 本意是遍歷dict,發現元素的值是0的話,就刪掉 ...

Python dict字典排序和多條件排序

利用lambda實現排序 要實現多條件排序,只需要依次指定排序的標準,具體實現如下 counter counter list sorted counter.iteritems key lambda x x 1 reverse true 根據value的大小排序 你 3 是 1 不是 1 counte...