從一開始學習python的時候,不少人就聽到的是元組和列表差很少,區別就是元組不能夠改變,列表能夠改變。python
從數據結構來講,這二者都應當屬於數組,元組屬於靜態的數組,而列表屬於動態數組。稍後再內存的分配上也會體現這一點。對於這兩種類型,除了能接受相同類型的值以外,也接受混合類型的值。算法
說元組不能改變的,其實只是看到了操做結果顯示出來的表面現象。能夠來看一下下列的操做(輸出結果截去了相同的高几位)。編程
a = (1,2,3) b = (1,2,3) c = a+b id(a) >>>71845752 id(b) >>>99964864 id(c) >>>97883880
這樣的結果意味着,對於元組,即使元組組成的值是相同的,每次綁定一個變量都是從新開闢空間生成一個新的。在執行a+b的元組組合操做時,也是在從新建立一個新的元組,而不是在前一個的基礎上拼接的。也就是說全部的內容都會被複制一份,因此這裏的複雜度不是O(1),而是O(n)。python3.x
此外,元組還有一個額外要注意的細節。在《Python高性能編程》一書中做者提到了1-20長度的小元組在被回收以後不會返還給操做系統處理,而是在程序內保留。這一細節多是根據python2.7來講的,對於python3.x版本未驗證。元組通常會緩存在Python的運行時環境中,使用的時候不用去訪問內核來分配內存。數組
列表主要的操做時增刪,切片,查找,排序。前二者依賴於列表的組織結構。因爲列表是可變的,因此列表除了自己的數據以外,每一個數據單元還會額外消耗一個單位的單元用於保存結構信息,以便列表進行從新調整大小。因此假如一樣保存10W數據,列表實際佔用的數據單元是遠大於10W這個數。緩存
對於列表的增長,主要是一個append()方法,涉及一個動態申請空間的算法。每次使用.append()操做的時候就會申請空間,申請老是按照必定的算法申請遠不止一個空間,便於接下來的擴展。這點在初學數據結構的時候可能都會知道,一次申請最好申請一個差很少的,這要比一個一個申請更有效,不過具體數量是多少,這多是一個奧卡姆剃刀的問題。預測式的空間申請算法,會帶來必定的額外空間開銷。數據結構
列表的.index()方法提供了一種搜索調用,但它的實現是線性搜索,效率並不高。app
列表的排序方法使用的是Tim排序,相對來講是一種比較好的實現。python2.7
列表在加載的時候,相對於元組的速度也是慢了許多。性能
對於二者其實均可以經過本身編寫安排引入算法來進行搜索或排序。若是本身編寫有點困難,也能夠藉助內建的bisect模塊。