簡體   English   中英

為什么在collections.deque中添加或刪除比在那里查找更慢?

[英]Why is adding to or removing from the middle of a collections.deque slower than lookup there?

這個關於某些數據結構的算法復雜性的wiki.python.org頁面對collections.deque對象說了以下內容:

deque(雙端隊列)在內部表示為雙向鏈表。 (好吧,一個數組列表而不是對象,以提高效率。)兩端都可以訪問,但即使看中間也很慢,中間增加或刪除速度較慢。

兩個問題:

1)是否可以添加到deque的中間? 我沒有在API中看到任何方法。

2)為什么在deque中間刪除(或添加)比查找慢? 它是一個雙向鏈表,因此一旦找到要添加的對象,添加/刪除應該是一個恆定時間操作。

  1. 可以使用remove()方法或del關鍵字刪除項目。 插入物品是不可能的。 (插入的唯一可能的方法是不會在API文檔中顯示切片分配,這對deque無效。)
  2. 因為,正如描述所說,它實際上是一個雙向鏈接的數組列表。 因此,插入或移除內容可能需要將元素從一個數組移動到另一個數組。 (我沒有看過實現,但我知道deque在尋找元素時使用了一個步幅技術,我假設所用數組的大小與步長相同,即62.)你必須轉移在刪除項目時,常規list存在大量內存,但至少它只在一個塊中,並且可以有效地移動。

可以使用python3.5插入。 index(), insert(), and copy()python3.5唯一可用的三種新方法, 在python 3.5中是新的,在早期版本中無法插入deque:

deque類現在定義了index(),insert()和copy(),以及支持+*運算符。 這允許將deques識別為MutableSequence並提高它們對列表的可替代性。 (供稿人:Raymond Hettinger issue 23704.)

您可以使用deldeque.remove從雙端隊列中間del

 deq = deque([1,2,3,4,5,6])
 del deq[4] 
 deq.remove(3) 

1)看起來在Python 3.5中添加了deque.insert()

2)來源: https//github.com/python/cpython/blob/d16a1520c2b22c3cbde7547937ba283db3e88ff5/Modules/_collectionsmodule.c#L952-L958

insert(),remove()和delitem()是根據rotate()實現的,為了簡單起見,在端點附近具有合理的性能。 如果由於某種原因這些方法變得流行,使用直接數據移動(類似於列表切片分配中使用的代碼)重新實現這一點並不難實現性能提升(通過僅移動每個指針一次而不是兩次)。

它變慢的原因是它的實現方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM