【Python算法】列表中的 append 比 insert 效率高的實質


  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操作都需要移動插入點右邊所有的元素,甚至在必要時需要把所有數組元素復制到另外一個更大的數組中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM