2012-02-29 10 views
12

Mam obiekt deque, który zawiera dużą ilość danych. Chcę wydobyć, powiedzmy, 4096 elementów z przodu kolejki (używam tego jako rodzaju FIFO). Wygląda na to, że powinien istnieć sposób robienia tego bez konieczności powtarzania ponad 4096 żądań popu.Jak mogę pop() wiele elementów z deque?

Czy to jest prawidłowe/wydajne/głupie?

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

Tak , jest poprawna. Tak, jest to rozsądnie wydajne, choć można je przyspieszyć za pomocą metod boundmet i itertools. Nie, to nie jest głupie :-) –

Odpowiedz

3

Jeżeli używasz metody deque.popleft() jest naprawdę najlepszym sposobem na uzyskanie elementów off z przodu. Można go indeksować, ale wydajność indeksu spada do połowy zawartości (w przeciwieństwie do listy o szybkim indeksowanym dostępie, ale powolne wyskakiwanie). Możesz tego uniknąć (zapisuje kilka linii kodu):

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

Trochę lepiej podoba mi się wersja OP. Ale jeśli istnieje potrzeba zwinięcia go do jednego liniowca, tutaj kilka szybkich wariantów itertools: '' C = map (apply, repeat (B.popleft, 4096)) '' lub możesz spróbować '' C = list (starmap (B.popleft, repeat ((), 4096))) '' –

7

Nie istnieje metoda multi-pop dla kotów. Możesz przesłać prośbę o dodanie funkcji do bugs.python.org i rozważę dodanie.

Nie znam szczegółów sprawy użyciu, ale jeśli dane pochodzą w blokach 4096, rozważmy przechowywania bloków w krotek lub list, a następnie dodając bloki do deque:

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

Dzięki Raymond, Jednym z powodów używania deque jest parametr maxlength - Używam tego jako kontener dla danych, które są ciągle przesyłane i dzięki temu mogę łatwo kontrolować ilość przechowywanych danych. Jego aspekt FIFO jest również dobry. –