2012-02-29 96 views
12

我有一个deque对象,它包含大量的数据。我想从队列前面提取4096个元素(我将它用作一种FIFO)。似乎应该有办法做到这一点,而不必迭代4096流行请求。我怎样才能从一个deque中弹出()很多元素?

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

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()) 
+3

是, 它是正确的。是的,尽管可以通过boundmethods和itertools进一步加速,但效率相当高。不,这不是愚蠢的:-) – 2012-03-01 02:06:07

回答

3

如果您使用的是deque.popleft()方法真的是下车前元素的最佳方法。您可以将其索引到索引中,但索引性能会降低到双端队列的中间(与具有快速索引访问权限但慢速弹出的列表相反)。尽管如此(可以省掉几行代码):

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

我喜欢OP的版本更好一点。但是如果需要将它折叠为一行,这里有一些快速的itertools变体:''C = map(apply,repeat(B.popleft,4096))''或者你可以尝试''C = list starmap(B.popleft,repeat((),4096)))'' – 2012-02-29 23:56:24

7

对于deques没有多重弹出方法。欢迎您向bugs.python.org提交功能请求,我会考虑添加它。

我不知道您的使用案例的细节,但如果你的数据进来的4096块,考虑存储元组或列表的块,然后加入块到双端队列:

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

感谢Raymond,使用deque的原因之一是maxlength参数 - 我使用它作为数据的容器,因此我可以轻松控制保存的数据量。它的FIFO方面也很好。 – 2012-03-01 14:45:41