繁体   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