我怎样才能从一个deque中弹出()很多元素?
我有一个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())
如果您使用的是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)))'' – 2012-02-29 23:56:24
对于deques没有多重弹出方法。欢迎您向bugs.python.org提交功能请求,我会考虑添加它。
我不知道您的使用案例的细节,但如果你的数据进来的4096块,考虑存储元组或列表的块,然后加入块到双端队列:
block = data[:4096]
d.append(block)
...
someblock = d.popleft()
感谢Raymond,使用deque的原因之一是maxlength参数 - 我使用它作为数据的容器,因此我可以轻松控制保存的数据量。它的FIFO方面也很好。 – 2012-03-01 14:45:41
是, 它是正确的。是的,尽管可以通过boundmethods和itertools进一步加速,但效率相当高。不,这不是愚蠢的:-) – 2012-03-01 02:06:07