欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python 里面的鏈表與傳統的 list 之間的差別

系統 1948 0
            
              import time


def log_time(func, *args, **kwargs):
    def inner():
        t1 = time.time()
        func(*args, **kwargs)
        t2 = time.time()
        print(f"使用的時間是{t2 - t1}s")
    return inner


@log_time
def append_func():
    ll = list()
    for i in range(10000):
        ll.append(i)


@log_time
def insert_func():
    ll = list()
    for j in range(10000):
        ll.insert(0, j)


insert_func()
append_func()

            
          

通過以上程序說明 python 中 list 的 append 要快于 insert。

其實, Python 中的 list 并不是傳統(計算機科學)意義上的列表。傳統的列表,也叫做鏈表(Linked List),通常是由一系列的節點來實現的,其每個節點(尾節點除外)都有一個指向下一個節點的引用。
使用 python 實現一個鏈表的節點類如下:

            
              class Node(object):
    def __init__(self, value, next=None):
        self.value = value
        self.next = next

            
          

接下來,我們就可以用其實現一個列表了:

            
              # L 即一個鏈表的頭節點
L = Node("a", Node("b", Node("c", Node("d"))))
print(L.value)
print(L.next.value)
print(L.next.next.value)
print(L.next.next.next.value)

            
          

這是一個所謂的單向列表,雙向列表的各節點里面還有持有一個指向前一個節點的引用。但是 python 中的 list 則于此有點不同,它不是由若干個獨立的節點相互引用形成的,而是一整塊單一連續的內存塊 —— 我們通常稱之為數組(array)。這直接導致了它和鏈表之間的一些重要的區別。

如果我們想要按照既定的索引值對某元素進行直接訪問的話,顯然使用數組會更加有效率。因為在數組中,我們可以直接計算出目標元素在內存中的位置,并且能對其進行直接訪問,而對于鏈表來說,我們必須從頭開始訪問整個鏈表。

而如果我們想要進行 insert 操作,對于鏈表來說,只要知道了在哪里執行 insert 操作,其操作成本是非常低的。無論其中有多少個元素,其操作時間大致上是相同的。而數組就非常不一樣了,它在每次執行 insert 的時候都需要移動插入點右邊的所有元素,甚至在必要時,我們還需要將這些列表元素整體搬到一個更大的數組中。也正是因為如此,append 操作通常采用一種被稱為動態數組或者是向量的特定解決方案。其主要想法是將內存分配得大一點,并且等到其溢出時,在線性時間內再次重新分配內存。

這樣做似乎會使得 append 和 insert 一樣糟糕,其實不然,因為盡管這兩種情況都有可能迫使我們去搬動大量的元素,但是主要的不同點在于,對于 append 操作,發生這樣的可能性要小得多。事實上,如果我們能確保所搬入的數據都大過原來數據一定的比例(例如 20% 甚至 100%),那么該操作的平均成本(或者說得更加確切一些,將這些搬運開銷均攤單每次 append 操作中去)通常是常數的。
我們可以認為,對于 python 中的 list 而言,append n 個數字所需要的運行時間是 O(n), 而在首端 insert 相同數量的數字需要的時間約為 O(n^2)。

更新時間: 2019.9.6
參考:《python 算法教程》


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚州国产 | 婷婷色激情 | 香蕉视频免费网站 | 欧美激情在线精品一区二区 | 欧美精品一区二区免费 | 国产成人免费视频网站高清观看视频 | 久久久久欧美精品网站 | 99热久久66是国产免费 | 色噜噜狠狠狠狠色综合久 | 欧美一级电影在线播放 | 久9久9 | 国产不卡视频在线播放 | 日韩高清在线亚洲专区vr | 精品欧美| 国产激情在线观看 | 日韩一区二区不卡 | 日韩国产成人资源精品视频 | 91短视频在线高清hd | 午夜在线亚洲男人午在线 | 电影长安道无删减免费看 | 久草大 | 看片亚洲| 嫩草视频在线观看 | 美日韩免费视频 | 久久aⅴ乱码一区二区三区 日韩精品一区二区在线观看 | 国模无水印一区二区三区 | 久草com| 黄色一级片视频 | 欧美精品一区二区在线电影 | 好吊日免费视频 | A片扒开双腿猛进入免费 | 精品欧美一区二区三区久久久小说 | 欧美一区二区三区视频 | 一区二区三区福利视频 | 波多野结衣一区二区三区 | 国产福利专区精品视频 | 日韩视频区| 欧美操人视频 | 国产精品久久久久久免费 | 日日夜夜精品免费视频 | 综合精品在线 |