簡體   English   中英

哪些類似 python deque 的容器在突變期間保留有效的迭代器?

[英]What python deque-like containers retain valid iterators during mutation?

在這里看到 collections.deque 不是一個很好的選擇,如果我想在改變數據結構的同時保留有效的迭代器。 python的stdlib中是否有任何數據結構在支持這兩個操作的同時保留有效的迭代器:

  • append - 在 O(1) 中將一些東西附加到容器的末尾攤銷
  • popleft - 從 O(1) 攤銷的容器開頭彈出一些東西

為什么我想要這樣的東西?

考慮一個生成數據流的類。 有多個消費者在這個類上調用__iter__來獲得一個迭代器來按順序消費數據。 為簡單起見,假設__iter__調用發生在任何__next__調用之前。

假設流足夠大,可能會超出合理的內存限制。 一個合理的做法是使用雙端隊列,這樣當迭代器在雙端隊列的末尾時,我們阻塞等待新數據並append它。 當所有迭代器都訪問過一個元素時,我們不再需要將它保存在內存中,所以我們popleft

C++ 中的std::deque實現使用緩沖區的循環列表,並允許我們在這兩個操作上擁有有效的迭代器。 python中也有類似的東西嗎?

itertools.tee專為您的用例而設計。 在內部,它使用指向共享 FIFO 隊列的迭代器,但數據結構是tee實現的內部結構(它是用 C 編寫的,至少是用 CPython 編寫的)。

tee頂部實現帶有迭代器(您的實際問題)的 FIFO 隊列可能是可能的,但它很棘手,部分原因是迭代器接口指定在引發StopIteration后不會再出現更多值,而典型的 FIFO 仍然可以在彈出失敗后使用。

暫無
暫無

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

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