append 與 insert 對比:
# append 操作 >>> count = 10**5 >>> nums = [] >>> for i in range(count): ... nums.append(i) ... >>> nums.reverse() # insert 操作 >>> nums = [] >>> for i in range(count): ... nums.insert(0, i)
Python中的列表並不是傳統意義上的列表,這也是Python中列表的append操作比insert操作高效的根本原因。
傳統意義上的列表,通常叫做鏈表,是通過一系列的節點來實現的,每個節點(尾節點除外)都有一個指向下一個節點的指針。
class Node:
def __init__(self,value,next=Node)
self.value=value
self.next=next
將節點構造成列表:
>>>L = Node("a",Node("b",Node("c",Node("d"))))
>>>L.next.next.value
'c'
但是Python中的列表則與此不同。它不是由若干個獨立的節點相互引用而組成的,而是一整塊單一連續的內存區塊--我們通常稱之為數組。這直接導致其與鏈表之間的一些區別。
盡管兩者在遍歷時的效率相差無幾(除了鏈表有一些額外開銷),但是如果我們按照既定索引值對某元素進行直接訪問的話,顯然使用數組會更加的高效。
因為在數組中,我們通常可以直接計算出目標元素在內存中的位置,並對其進行直接訪問。而對於鏈表,我們需要從頭開始遍歷整個鏈表。
對於insert操作來說,情況又有所不同。
-
對於鏈表而言,只要知道了在哪里執行insert操作,其操作成本是非常低的。無論該鏈表中有多少元素,其操作時間大致相同。
-
對於數組而言,每次執行insert操作都需要移動插入點右邊所有的元素,甚至在必要時需要把所有數組元素復制到另外一個更大的數組中。
