2012-02-29 91 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