02.26 Python3 自學第9天:數據結構

Python3 自學第9天:數據結構

在開始之前我們加深一下對“序列”,“對象”,“引用”概念的理解,不太清楚的朋友可以再瞭解下:

什麼是序列,Python中都有哪些序列?

序列中的元素都是有序的,擁有自己的編號(即索引值,也叫下標,默認從0開始),可以通過索引值獲取序列中對應的元素。

Python總共有6個內置的序列:字符串、Unicode字符串、列表、元組、buffer對象和 xrange 對象。

序列一般可以做這些操作:索引、長度、切片、遍歷、組合(序列相加)、檢查成員、重複(乘法)、最小值和最大值。

數據類型中字符串string,列表list,元組tuple屬於序列類型;

從可變性上講:字符串string,元組tuple屬於不可變序列,列表list屬於可變序列。

不可變序列一般不能對添加,修改和刪除元素,所以也就沒有添加,修改和刪除的操作方法。

什麼是對象,什麼是引用?

python中一切皆對象。常量,變量,類,函數等等都可以叫對象。

引用一般是指對象的引用,用來間接操作“對象”的,也可以把引用理解為對象的“別名”,一個對象可以有多個別名,也就是說一個對象可以有多個引用;好比我們人來說,一個人就是一個具體的對象,他有學名,小名,還有綽號,都指向的是這個具體的“人”對象。

Python作為一種動態類型的語言,對象和引用是分離的,通過“引用計數”來跟蹤記錄已經分配的內存;

當一個對象被創建或者被賦值時,它的初始引用計數為1,當有其他變量也被賦值到這個對象時,引用計數就會增加;

當這個對象不再被其它對象引用時,引用計數就會減小,直到等於0時GC就會回收對象,該對象也就被徹底銷燬了。

Python3 自學第9天:數據結構

我們可以把上面的值“123”理解為“對象”;a,b,c理解成對象“123”的引用。

等號 = 我們通常叫賦值,可以理解成給對象“123”起別名。

a,b,c這三個引用指向同一個內存地址,也可以說這三個引用指向同一個對象,引用本身存儲的是一個內存地址。

如果我們把 a 這條引用刪除掉,引用計數會減小,其它引用是不受影響的。

當把a,b,c三條引用全部刪除掉,引用計數變成0,對象將被GC回收,釋放內存。

Python3 自學第9天:數據結構

Python中一切皆對象,所以 a,b,c這三條引用我們通常也叫對象。

今天我們簡單分析下Python中幾個常見的數據結構:列表list,元組tuple,字典dict,集合set;

數據結構:線性表和鏈表、堆棧和隊列、樹和二叉樹、圖、字典和集合、B樹、哈希表。

列表list和元組tuple都是由鏈表(Linked list)實現的,即列表是鏈表存儲結構,這也解釋了為什麼列表和元組都是有序的。

線性表分為順序表和鏈接表兩種,鏈表是線性表中的第二種,所以並不會按線性的順序存儲數據,而是在每一個節點裡存著下一個節點的指針。

字典dict和集合set都是由哈希表(hash table)實現的,所以都是無序的。

字典dict和集合set都是用空間來換時間,佔用空間大,但檢索效率高(和元素多少無關);

因為少了key的存儲,集合set比字典dict佔用的空間相對會小些。

列表list佔用空間相對較少,添加和修改元素效率高,但會隨著元素個數越來越多,檢索查詢速度會越來越慢。

元組與列表很類似,不同之處在於元組的元素不能修改,還有列表在創建,變更等操作時需要向系統內核申請空間,元組則是緩存於Python運行時環境中,意味著每次使用元組時無須訪問內核去分配內存。

如果想測試一段代碼的運行時間可以使用timeit模塊:

Python3 自學第9天:數據結構

我們可以看出在初始化10個相同元素的列表和元組時,元組要比列表快了6倍多,比用append()初始化列表快了77多倍;遍歷時這種速度差距會更大,所以這是元組一個很神奇的地方,它可以輕鬆快速地創建,就在於元組避免跟操作系統頻繁打交道,而列表list需要向系統內核頻繁申請空間。

我們再看下列表推導式與普通for循環的性能比較:

Python3 自學第9天:數據結構

我們可以看出,實現同樣的功能執行1萬次,列表推導式要比普通for循環快了4.5秒左右,速度快了2.5倍。所以,推薦大家在以後寫代碼時優先使用列表推導式;

如果上面存在說法錯誤或者描述不準確的地方,希望大家在評論區裡指出來,感謝!

上一篇:

【極客乾貨】從事IT行業十餘年,在移動互聯網開發,J2EE企業級開發,IOT物聯網,AI人工智能等方面有點技術積累,熟練使用C/C++,Java,Python等編程語言。從2009年開始接觸Python,後續借空閒時間將個人熟悉的技術乾貨系統性分享給大家,也許我的分享會讓你少走一些彎路,如果您覺得還可以,請多多關注,評論和轉發,非常感謝!


分享到:


相關文章: