Python?中的?list、tuple、set、dict的底層實(shí)現(xiàn)小結(jié)
在 Python 中,list
、tuple
、set
和 dict
是四種非常常用的數(shù)據(jù)結(jié)構(gòu)。它們的底層實(shí)現(xiàn)各有特點(diǎn),這些實(shí)現(xiàn)方式?jīng)Q定了它們的性能和使用場(chǎng)景。以下是對(duì)這四種數(shù)據(jù)結(jié)構(gòu)底層實(shí)現(xiàn)的詳細(xì)解釋:
1. list(列表)
list
是 Python 中最常用的數(shù)據(jù)結(jié)構(gòu)之一,它是一個(gè) 動(dòng)態(tài)數(shù)組,用于存儲(chǔ)有序的元素集合。
底層實(shí)現(xiàn)
- 存儲(chǔ)方式:
list
是一個(gè) 連續(xù)的內(nèi)存塊,用于存儲(chǔ)元素的引用(指針)。這意味著list
中的元素可以是任意類型,因?yàn)榇鎯?chǔ)的是對(duì)象的引用,而不是對(duì)象本身。 - 動(dòng)態(tài)擴(kuò)展:
list
的大小是動(dòng)態(tài)的。當(dāng)列表空間不足時(shí),Python 會(huì)分配一個(gè)新的更大的內(nèi)存塊,并將舊數(shù)據(jù)復(fù)制到新內(nèi)存塊中。通常,新的內(nèi)存塊大小是當(dāng)前大小的 1.125 倍(具體倍數(shù)可能因 Python 版本而異)。 - 內(nèi)存管理:由于
list
是連續(xù)內(nèi)存,因此它支持快速的隨機(jī)訪問(wèn)(通過(guò)索引訪問(wèn)元素的時(shí)間復(fù)雜度為 O(1))。但插入和刪除操作(尤其是非尾部操作)可能需要移動(dòng)大量元素,時(shí)間復(fù)雜度為 O(n)。
性能特點(diǎn)
優(yōu)點(diǎn):
- 支持快速的隨機(jī)訪問(wèn)(通過(guò)索引)。
- 內(nèi)部實(shí)現(xiàn)簡(jiǎn)單,適合存儲(chǔ)有序數(shù)據(jù)。
缺點(diǎn):
- 插入和刪除操作(尤其是非尾部操作)效率較低。
- 內(nèi)存占用可能較高,因?yàn)樾枰A(yù)留額外空間以支持動(dòng)態(tài)擴(kuò)展。
2. tuple(元組)
tuple
是一個(gè) 不可變的有序集合,用于存儲(chǔ)一組固定的數(shù)據(jù)。
底層實(shí)現(xiàn)
- 存儲(chǔ)方式:與
list
類似,tuple
也是通過(guò) 連續(xù)的內(nèi)存塊 存儲(chǔ)元素的引用。不同的是,tuple
是不可變的,這意味著它的大小和內(nèi)容在創(chuàng)建后不能被修改。 - 內(nèi)存分配:由于
tuple
是不可變的,Python 在創(chuàng)建tuple
時(shí)會(huì)一次性分配足夠的內(nèi)存來(lái)存儲(chǔ)所有元素,而不需要考慮動(dòng)態(tài)擴(kuò)展。 - 性能優(yōu)化:由于不可變性,
tuple
在某些情況下比list
更高效,尤其是在作為字典的鍵或集合的元素時(shí),因?yàn)樗鼈兊墓V凳枪潭ǖ摹?/li>
性能特點(diǎn)
優(yōu)點(diǎn):
- 不可變性保證了數(shù)據(jù)的安全性。
- 在某些場(chǎng)景下(如作為哈希表的鍵)比
list
更高效。
缺點(diǎn):
- 不支持動(dòng)態(tài)修改,靈活性較差。
3. set(集合)
set
是一個(gè) 無(wú)序的集合,用于存儲(chǔ)唯一的元素。它支持高效的成員查找、插入和刪除操作。
底層實(shí)現(xiàn)
- 存儲(chǔ)方式:
set
的底層實(shí)現(xiàn)是基于 哈希表 的。每個(gè)元素通過(guò)哈希函數(shù)映射到一個(gè)唯一的哈希值,并存儲(chǔ)在哈希表中。 - 沖突解決:當(dāng)兩個(gè)元素的哈希值沖突時(shí),Python 使用 鏈表 或 開(kāi)放尋址法 來(lái)解決沖突。具體實(shí)現(xiàn)取決于 Python 的版本。
- 動(dòng)態(tài)擴(kuò)展:與
list
類似,set
的大小也是動(dòng)態(tài)的。當(dāng)哈希表的負(fù)載因子(元素?cái)?shù)量與哈希表大小的比值)超過(guò)某個(gè)閾值時(shí),哈希表會(huì)自動(dòng)擴(kuò)展,重新分配更大的內(nèi)存空間并重新哈希所有元素。
性能特點(diǎn)
優(yōu)點(diǎn):
- 成員查找、插入和刪除操作的時(shí)間復(fù)雜度為 O(1)。
- 自動(dòng)去重,適合存儲(chǔ)唯一元素。
缺點(diǎn):
- 不支持重復(fù)元素。
- 不支持有序訪問(wèn)。
4. dict(字典)
dict
是一個(gè) 鍵值對(duì)的集合,用于存儲(chǔ)映射關(guān)系。它是 Python 中最強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)之一。
底層實(shí)現(xiàn)
- 存儲(chǔ)方式:
dict
的底層實(shí)現(xiàn)也是基于 哈希表 的。每個(gè)鍵通過(guò)哈希函數(shù)映射到一個(gè)唯一的哈希值,并存儲(chǔ)在哈希表中。值則與鍵關(guān)聯(lián)存儲(chǔ)。 - 沖突解決:與
set
類似,dict
也使用鏈表或開(kāi)放尋址法解決哈希沖突。 - 動(dòng)態(tài)擴(kuò)展:當(dāng)哈希表的負(fù)載因子超過(guò)某個(gè)閾值時(shí),
dict
會(huì)自動(dòng)擴(kuò)展,重新分配更大的內(nèi)存空間并重新哈希所有鍵值對(duì)。 - 鍵的唯一性:
dict
的鍵必須是不可變類型(如整數(shù)、字符串、元組等),因?yàn)樗鼈冃枰С止2僮鳌?/li>
性能特點(diǎn)
優(yōu)點(diǎn):
- 鍵值對(duì)查找、插入和刪除操作的時(shí)間復(fù)雜度為 O(1)。
- 支持靈活的鍵值映射關(guān)系。
缺點(diǎn):
- 鍵必須是不可變類型。
- 不支持有序訪問(wèn)(Python 3.7+ 中的
dict
保持了插入順序,但這不是通過(guò)哈希表實(shí)現(xiàn)的,而是通過(guò)額外的機(jī)制)。
總結(jié)
數(shù)據(jù)結(jié)構(gòu) | 底層實(shí)現(xiàn) | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|
list | 動(dòng)態(tài)數(shù)組 | 隨機(jī)訪問(wèn)快,支持動(dòng)態(tài)擴(kuò)展 | 插入和刪除效率低,內(nèi)存占用可能較高 |
tuple | 靜態(tài)數(shù)組 | 不可變,適合哈希 | 不支持動(dòng)態(tài)修改 |
set | 哈希表 | 成員查找、插入和刪除快,自動(dòng)去重 | 不支持重復(fù)元素,不支持有序訪問(wèn) |
dict | 哈希表 | 鍵值對(duì)查找、插入和刪除快 | 鍵必須是不可變類型,不支持有序訪問(wèn) |
擴(kuò)展閱讀
- Python 官方文檔:數(shù)據(jù)模型
- Python 源碼分析:可以參考 Python 源碼 中的實(shí)現(xiàn)細(xì)節(jié),特別是
listobject.c
、tupleobject.c
、setobject.c
和dictobject.c
文件。 - 性能優(yōu)化:了解這些數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)可以幫助你更好地選擇合適的數(shù)據(jù)結(jié)構(gòu)來(lái)優(yōu)化代碼性能。
如果你對(duì)某個(gè)數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)有更具體的問(wèn)題,歡迎繼續(xù)提問(wèn)!
到此這篇關(guān)于Python 中的 list、tuple、set、dict的底層實(shí)現(xiàn)的理解的文章就介紹到這了,更多相關(guān)Python list、tuple、set、dict內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Opencv實(shí)現(xiàn)計(jì)算兩條直線或線段角度方法詳解
這篇文章主要介紹了Opencv實(shí)現(xiàn)計(jì)算兩條直線或線段角度方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12python中使用PIL制作并驗(yàn)證圖片驗(yàn)證碼
本篇文章給大家分享了python中使用PIL制作并驗(yàn)證圖片驗(yàn)證碼的具體代碼以及說(shuō)明,需要的朋友參考下吧。2018-03-03python中實(shí)現(xiàn)迭代器(iterator)的方法示例
我們經(jīng)常需要遍歷一個(gè)對(duì)象中的元素,在Python中這種功能是通過(guò)迭代器來(lái)實(shí)現(xiàn)的。下面這篇文章主要給大家介紹了python中實(shí)現(xiàn)迭代器(iterator)的方法示例,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01python結(jié)合selenium獲取XX省交通違章數(shù)據(jù)的實(shí)現(xiàn)思路及代碼
這篇文章主要介紹了python結(jié)合selenium獲取XX省交通違章數(shù)據(jù)的實(shí)現(xiàn)思路及代碼方法的相關(guān)資料2016-06-06采用python實(shí)現(xiàn)簡(jiǎn)單QQ單用戶機(jī)器人的方法
這篇文章主要介紹了采用python實(shí)現(xiàn)簡(jiǎn)單QQ單用戶機(jī)器人的方法,需要的朋友可以參考下2014-07-07python 文件下載之?dāng)帱c(diǎn)續(xù)傳的實(shí)現(xiàn)
用python進(jìn)行文件下載的時(shí)候,一旦出現(xiàn)網(wǎng)絡(luò)波動(dòng)問(wèn)題,導(dǎo)致文件下載到一半。如果將下載不完全的文件刪掉,那么又需要從頭開(kāi)始,如果連續(xù)網(wǎng)絡(luò)波動(dòng),是不是要頭禿了。本文提供斷點(diǎn)續(xù)傳下載工具方法,希望可以幫助到你2021-11-11Python動(dòng)態(tài)語(yǔ)言與鴨子類型詳解
這篇文章主要介紹了Python動(dòng)態(tài)語(yǔ)言與鴨子類型詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python制作簡(jiǎn)易聊天器,搭建UDP網(wǎng)絡(luò)通信模型
這篇文章主要介紹了Python制作簡(jiǎn)易聊天器,搭建UDP網(wǎng)絡(luò)通信模型,用UDP建立網(wǎng)絡(luò)模型來(lái)完成一個(gè)簡(jiǎn)單的聊天器,感興趣的小伙伴可以參考一下,希望對(duì)你有所幫助2022-01-01Python 冷門(mén)魔術(shù)方法小結(jié)
本文主要介紹了Python 冷門(mén)魔術(shù)方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04