2012-02-29 41 views
12

Tôi có một đối tượng deque chứa một lượng lớn dữ liệu. Tôi muốn trích xuất, nói rằng, 4096 yếu tố từ phía trước của hàng đợi (tôi đang sử dụng nó như là một loại FIFO). Nó có vẻ như có nên có cách để làm điều này mà không cần phải lặp lại hơn 4096 yêu cầu pop.Làm cách nào để bật() nhiều phần tử từ một deque?

Điều này có đúng/hiệu quả/ngu ngốc không?

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

Có , đung vậy. Có, nó là hợp lý hiệu quả mặc dù nó có thể được thêm sped-up với boundmethods và itertools. Không, nó không phải là ngu ngốc :-) –

Trả lời

3

Phương thức .popleft() thực sự là phương pháp tốt nhất để đưa các yếu tố ra phía trước. Bạn có thể lập chỉ mục vào nó, nhưng hiệu suất chỉ mục sẽ giảm dần về phía giữa của deque (trái ngược với một danh sách có truy cập được lập chỉ mục nhanh chóng, nhưng các bước xuất hiện chậm). Bạn có thể lấy đi với điều này mặc dù (tiết kiệm một vài dòng mã):

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

Tôi thích phiên bản của OP tốt hơn một chút. Nhưng nếu cần phải thu gọn nó thành một lớp lót, ở đây một số biến thể itertools nhanh: '' C = map (áp dụng, lặp lại (B.popleft, 4096)) '' hoặc bạn có thể thử '' C = list (starmap (B.popleft, repeat ((), 4096))) '' –

7

Không có phương pháp đa pop nào cho deques. Chúng tôi hoan nghênh bạn gửi yêu cầu tính năng tới bug.python.org và tôi sẽ xem xét thêm yêu cầu đó.

Tôi không biết các chi tiết của trường hợp sử dụng của bạn, nhưng nếu dữ liệu của bạn đi kèm trong khối 4096, hãy xem xét việc lưu trữ các khối trong các bộ hoặc danh sách và sau đó thêm các khối vào deque:

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

Cảm ơn Raymond, Một trong những lý do để sử dụng deque là tham số maxlength - Tôi đang sử dụng nó như một vùng chứa cho dữ liệu liên tục được truyền và do đó tôi có thể dễ dàng kiểm soát lượng dữ liệu được lưu giữ. Các khía cạnh FIFO của nó là tốt quá. –