【问题标题】:How can I pop() lots of elements from a deque?如何从双端队列中弹出()很多元素?
【发布时间】:2012-03-19 10:35:51
【问题描述】:

我有一个包含大量数据的双端队列对象。我想从队列的前面提取 4096 个元素(我将它用作一种 FIFO)。似乎应该有办法做到这一点,而不必迭代超过 4096 个弹出请求。

这是正确/高效/愚蠢的吗?

A = arange(100000)
B = deque()
C = [] # List will do 
B.extend(A) # Nice large deque

# extract 4096 elements
for i in xrange(4096):
   C.append(A.popleft())

【问题讨论】:

  • 是的,没错。是的,虽然它可以通过 boundmethods 和 itertools 进一步加速,但它的效率相当高。不,这并不愚蠢:-)

标签: python deque


【解决方案1】:

没有用于双端队列的多弹出方法。欢迎您向 bugs.python.org 提交功能请求,我会考虑添加它。

我不知道您的用例的详细信息,但如果您的数据以 4096 个块的形式出现,请考虑将这些块存储在元组或列表中,然后将这些块添加到双端队列:

block = data[:4096]
d.append(block)
...
someblock = d.popleft()

【讨论】:

  • 感谢 Raymond,使用 deque 的原因之一是 maxlength 参数 - 我将其用作不断流式传输的数据的容器,因此我可以轻松控制保留的数据量.它的 FIFO 方面也很好。
【解决方案2】:

在您使用deque 的地方,.popleft() 方法确实是让元素脱离前面的最佳方法。您可以对其进行索引,但索引性能会降低到双端队列的中间(与具有快速索引访问但缓慢弹出的列表相反)。不过,您可以侥幸逃脱(节省几行代码):

A = arange(100000)
B = deque(A)
C = [B.popleft() for _i in xrange(4096)]

【讨论】:

  • 我更喜欢 OP 的版本。但是如果需要将其折叠成单线,这里有一些快速的 itertools 变体:C = map(apply, repeat(B.popleft, 4096)) 或者你可以尝试C = list(starmap(B.popleft, repeat((), 4096)))
  • @RaymondHettinger:您的评论比your answer above 更有用,这在很大程度上消除了首先使用deque 的意义。不出所料,前者获得的赞成票多于后者。 总是检查那些 cmets,伙计们。
猜你喜欢
  • 2018-09-08
  • 2017-04-04
  • 2020-08-05
  • 2020-07-06
  • 2020-09-03
  • 2018-12-02
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多