[英]Why is collections.deque slower than collections.defaultdict?
[英]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
中間刪除(或添加)比查找慢? 它是一個雙向鏈表,因此一旦找到要添加的對象,添加/刪除應該是一個恆定時間操作。
remove()
方法或del
關鍵字刪除項目。 插入物品是不可能的。 (插入的唯一可能的方法是不會在API文檔中顯示切片分配,這對deque
無效。) 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.)
您可以使用del
或deque.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.