2012-02-29 16 views
12

Ho un oggetto deque che contiene una grande quantità di dati. Voglio estrarre, ad esempio, 4096 elementi dal fronte della coda (lo sto usando come una sorta di FIFO). Sembra che ci dovrebbe essere modo di farlo senza dover iterare oltre 4096 richieste pop.Come posso pop() molti elementi da un deque?

È corretto/efficiente/stupido?

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

Sì , è corretto. Sì, è ragionevolmente efficiente anche se può essere ulteriormente accelerato con metodi e itertools. No, non è stupido :-) –

risposta

3

Dove si sta utilizzando un metodo deque il .popleft() è davvero il migliore metodo di ottenere elementi fuori la parte anteriore. È possibile indicizzare in esso, ma le prestazioni dell'indice si degradano verso il centro del deque (al contrario di un elenco che ha un accesso rapido indicizzato, ma pop lento). Potresti farla franca (salva qualche riga di codice):

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

Mi piace la versione dell'OP un po 'meglio. Ma se vi è la necessità di comprimerlo con un solo liner, ecco alcune varianti di itertools veloci: '' C = map (apply, repeat (B.popleft, 4096)) '' oppure si potrebbe provare '' C = list (starmap (B.popleft, repeat ((), 4096))) '' –

7

Non esiste un metodo multi-pop per deques. Ti invitiamo a inviare una richiesta di funzionalità a bugs.python.org e prenderò in considerazione l'aggiunta.

Non conosco i dettagli del vostro caso d'uso, ma se i dati è disponibile in blocchi di 4096, considero la memorizzazione dei blocchi in tuple o elenchi e quindi aggiungendo i blocchi per il deque:

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

Grazie Raymond, uno dei motivi per utilizzare il deque è il parametro maxlength - lo sto usando come contenitore per i dati che sono costantemente in streaming e quindi posso facilmente controllare la quantità di dati conservati. Anche l'aspetto FIFO è buono. –

Problemi correlati