1. 程式人生 > >字典和列表性能哪家強,讓我用一百萬隨機字符來為你揭曉!

字典和列表性能哪家強,讓我用一百萬隨機字符來為你揭曉!

tro 哈希表 並發 快速 random模塊 符號 基礎 運行時 散列表

Python中有兩個非常常用的數據結構,列表和字典。在做數據存儲的時候,到底二者哪家強,字典還是列表,還是差不多呢。與其猜測,不如我們用數據說話!

思路:

生成一個很大的文本文件
分別用列表和字典來存儲數據,然後讀取並搜索數據
考察列表和字典做為數據結構的時候,存儲的時間,搜索和訪問的時間
計算兩種方案的消耗時間
1.創建百萬字符文件

我們需要一個較大的文件,來證明我們的猜想!幹脆直接生成一個有百萬行的字符串亂碼文件。

1).產生一串隨機字符:

取一些隨機的字符,包括數字,字符,標點和符號等等,一共95個隨機字符。
技術分享圖片
2).把字符序列,進行隨機化分布

def create_random_nums(nums=None):

random.shuffle(nums)

return nums

直接用random模塊,把字符串序列隨機化.

3).隨機100萬行的字符序列,寫入文件

def create_file():

chars=get_random_chars()

for i in range(1000000):

with open(‘data.txt‘,‘at‘) as f:

data=create_random_nums(chars)

f.writelines(data)

f.write(‘ ‘)

用個大循環把隨機的字符串寫入文件中,大概有一百萬行,文件大小在100M左右,這裏只是試例代碼,其實可以用並發寫更快一點。

2.用列表做數據結構

技術分享圖片
先從百萬行隨機字符串文件中,讀取一定數量的數據(10000行數據),
存入10000行放入all_data列表
接著從10000行all_data列表裏面隨機取1000行
放到一個target_data列表
最後搜索這個target_data列表
3.用字典做數據結構

我們用相同的場景,用字典作為數據結構容器,從百萬文件中來讀取數據。

考察字典的存儲數據的時間,以及字典中的搜索數據的時間。

技術分享圖片
先從百萬行字符串文件中,讀取一定數量的字符(假如為10000行)
存到到字典裏面,把每一行做為key
接著提取這個字典裏面的key,把這個10000行的數據,轉為列表
從10000行裏面隨機取1000行出來,放到target_data列表
4.計算運行時間

我們計算兩種數據結構運行的時間,為了更準確。我們運行100次求均值

技術分享圖片
看一下用列表消耗的時間:

all_data, target_data = read_list_data(file_name, 100000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

>0.09532666921615601秒

看一些用字典消耗的時間:

all_data, target_data = read_dict_data(file_name, 100000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

>0.00016084909439086914秒

字典的性能是列表的600倍,可見字典作為數據結構,會快快快很多!尤其是非常大的數據存儲和讀取的時候。

既然字典這麽快,那麽線性增加搜索,看看耗時如何,剛才是1×××面搜1千,現在我們從二十萬搜1千看看,1百×××面搜1千看看。

all_data, target_data = read_dict_data(file_name, 200000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

>0.00014181852340698243

all_data, target_data = read_dict_data(file_name, 1000000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

>0.00022308111190795897

發現消耗的時間差不多

結論:

為啥字典性能比列表快這麽多?這要從字典和列表的原理說起,字典其實是散列表或者說是哈希表!內部存儲的時候是根據hash地址來搜索的,搜索的時候不需要從頭開始搜索,這也就是為啥哈希表變大,20萬和100萬的查詢的速度差不多!

而列表是什麽,Python列表是一種順序線性表,好處是插入,移除比較快速,但是搜索會慢很多!

綜上所述,由於Python中字典的性能遠高於列表,Python源碼中很多底層的對象都是用字典類型,只要重載hash魔法函數,讓它返回一個可哈希的對象,這樣的對象就可以用做字典的key。小夥伴今天是不是又學到一招!

文章地步為你有準備Python零基礎flask教程,點解鏈接進入就能了解:Python flask零基礎教程

字典和列表性能哪家強,讓我用一百萬隨機字符來為你揭曉!