我如何从双端队列中弹出()大量元素?

Ros*_*s W 18 python deque

我有一个deque对象,它包含大量数据.我想从队列的前面提取4096个元素(我将它用作一种FIFO).似乎应该有这样做的方式,而不必迭代超过4096个pop请求.

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

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())
Run Code Online (Sandbox Code Playgroud)

Ray*_*ger 7

deques没有多流行方法.欢迎您向bugs.python.org提交功能请求,我会考虑添加它.

我不知道您的用例的详细信息,但如果您的数据以4096为块,请考虑将块存储在元组或列表中,然后将块添加到deque中:

block = data[:4096]
d.append(block)
...
someblock = d.popleft()
Run Code Online (Sandbox Code Playgroud)

  • 感谢Raymond,使用deque的原因之一是maxlength参数 - 我使用它作为数据的容器,不断被流式传输,因此我可以轻松控制保留的数据量.它的FIFO方面也很好. (5认同)

g.d*_*d.c 5

当您使用该deque方法时.popleft(),该方法确实是从前面获取元素的最佳方法。您可以为其建立索引,但索引性能在双端队列的中间会降低(与具有快速索引访问但弹出缓慢的列表相反)。不过你可以摆脱这个(节省几行代码):

A = arange(100000)
B = deque(A)
C = [B.popleft() for _i in xrange(4096)]
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢OP的版本。但如果需要将其折叠为一行,这里有一些快速的 itertools 变体:``C = map(apply, Repeat(B.popleft, 4096))`` 或者你可以尝试``C = list( starmap(B.popleft, 重复((), 4096)))`` (9认同)
  • @RaymondHettinger:你在这里的评论比[上面的答案](/sf/answers/665595381/)更有用,这很大程度上消除了首先使用“双端队列”的意义。不出所料,前者获得的支持票数高于后者。*请务必检查这些评论,伙计们。* (3认同)