卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

python 兩個list對比 如何理解Python中的集合和字典?

如何理解Python中的集合和字典?字典和集合是高度優(yōu)化的數(shù)據結構,特別是對于查找、添加和刪除操作。本節(jié)將通過示例介紹它們在特定場景中的性能,并將它們與列表等其他數(shù)據結構進行比較。例如,有一個存儲產品

如何理解Python中的集合和字典?

字典和集合是高度優(yōu)化的數(shù)據結構,特別是對于查找、添加和刪除操作。本節(jié)將通過示例介紹它們在特定場景中的性能,并將它們與列表等其他數(shù)據結構進行比較。

例如,有一個存儲產品信息(產品ID、名稱和價格)的列表,現(xiàn)在的需求是借助產品ID找出價格。實現(xiàn)代碼如下:

定義查找_產品_價格(產品,product_id):

對于id,products:的價格

如果我是product_id:

退貨價格

不返回

產品[

(111, 100),

(222, 30),

(333, 150)

]

打印(產品222的價格是{}。格式(find_product_price(products,222)))

運行結果如下:

產品222的價格是30英鎊

在上述方案的基礎上,如果鏈表有n個元素,由于搜索過程需要遍歷鏈表,那么最壞情況下的時間復雜度為O(n)。即使先對列表進行排序,再使用二分搜索法算法,也要O(logn)時間復雜度,更不用說O(nlogn)時間對列表進行排序了。

但是如果用字典來存儲這些數(shù)據,那么查找會非常方便高效,而且可以用O(1)的時間復雜度來完成,因為不需要遍歷字典,直接通過鍵的哈希值就可以找到對應的值。實現(xiàn)代碼如下:

產品{

111: 100,

222: 30,

333: 150

}

打印(產品222的價格是{}。格式(產品[222])

運行結果如下:

產品222的價格是30英鎊

有些讀者可能對時間復雜性沒有直觀的理解。它不 沒關系。我再給你舉個例子。在下面的代碼中,初始化100,000個元素的產品,分別計算使用list和set統(tǒng)計產品價格數(shù)量的運行時間:

#統(tǒng)計時間需要使用時間模塊中的函數(shù),就知道了。

導入時間

def find_unique_price_using_list(products):

唯一價格列表[]

對于_,products:的價格# A

如果價格不在unique_pric: # B

唯一價格(價格)

return len(唯一價格列表)

id[范圍(0,100000)中x的x]

價格[x對x,在范圍(200000,300000)內]

產品列表(郵政編碼(id,價格))

#計算列表版本的時間

start_using_list _counter()

查找_唯一_價格_使用_列表(產品)

end_using_list _count: { }打印(經過的時間)。格式(結束使用列表開始使用列表)

#使用集合做同樣的工作

def find_unique_price_using_set(products):

unique_price_set集合()

對于_,products:的價格

唯一價格(價格)

return len(唯一價格集)

#計算集合版本的時間

啟動使用設置計數(shù)器()

查找_唯一_價格_使用_集合(產品)

end_using_set _count: { }打印(經過的時間)。格式(結束使用設置-開始使用設置)

運行結果如下:

使用list: 68的時間流逝。56866 . 66666666667

使用s: 0.01表示時間流逝。58660.08888888861

能看到了吧,才十萬個數(shù)據,兩者的速度差那么大。而企業(yè)的后臺數(shù)據往往是幾億甚至幾十億的量級。因此,如果使用不合適的數(shù)據結構,很容易導致服務器崩潰,不僅影響用戶體驗,還會給公司帶來巨大的財產損失。

那么,為什么字典和收藏的效率如此之高,尤其是查找、插入和刪除的操作?

字典和收藏的工作原理。

字典和集合的效率與其內部數(shù)據結構密切相關。與其他數(shù)據結構不同,字典和集合的內部結構是哈希表:

對于字典來說,這個表存儲三個元素:散列、鍵和值。

對于集合,哈希表中只存儲一個元素。

對于以前版本的Python,其哈希表結構如下:

|哈希值(哈希)鍵值(值)

。|...

0 |哈希0鍵0值0

。|...

1 | hash1 k:·邁克,dob: 1999-01-01,g:男}

然后,它將以類似于下面的形式存儲:

條目[

[ - , - , - ]

[-230273521,出生日期,1999年1月1日],

[ - , - , - ],

[ - , - , - ],

[1231236123,姓名,邁克],

[ - , - , - ],

[9371539127,性別,男]

]

顯然,這是對存儲空間的極大浪費。為了提高存儲空間的利用率,目前的哈希表除了字典本身的結構之外,還會將索引與哈希值、鍵和值分開,就是下面這種結構:

指數(shù)

-

無|索引|無|無|索引|無|索引...

-

進入

-

哈希0鍵0值0

--

hash1 key1值1

-

hash2鍵2值2

-

...

-

在此基礎上,上述字典在新哈希表結構下的存儲形式為:

索引[無,1,無,無,0,無,2]

條目[

[1231236123,姓名,邁克],

[-230273521,出生日期,1999年1月1日],

[9371539127,性別,男]

]

通過對比可以發(fā)現(xiàn),空間利用率有了很大的提高。

明確具體的設計結構,然后分析如何使用哈希表完成數(shù)據的插入、查找和刪除。

哈希表插入數(shù)據

在向字典中插入數(shù)據時,Python會先根據鍵(通過hash(key)函數(shù))計算出相應的哈希值,而在向集合中插入數(shù)據時,Python會根據元素本身(通過hash (value)函數(shù))計算出相應的哈希值。

例如:

dic {nam:1}

打印(哈希(名稱))

s《哈希表詳解》一節(jié)中詳細了解。

哈希表查找數(shù)據

在哈希表中查找數(shù)據類似于插入操作。Python會根據哈希值找到元素在哈希表中應該存放的位置,然后將其哈希值和k

python list占用多大內存?

列表類似于向量。

對象和指針數(shù)組是分開分配的,數(shù)組在堆上。指針數(shù)組的大小是動態(tài)分配的,分配的內存必須大于實際的。由于是動態(tài)分配的,realloc在調整大小時會移動數(shù)據和復制數(shù)據。對于大量數(shù)據最好使用鏈表。

字典類似于散列表

默認情況下,字典本身是有元素容量的,如果不足,會在堆上分配。如果需要擴展或收縮,內存將被動態(tài)地重新分配并再次散列。Dict keys()和其他調用生成一個列表。如果數(shù)量很大,建議使用迭代器。