Alcune risposte hanno sostenuto un vantaggio di velocità "10x" di coda doppia vs list-usato-come-FIFO quando entrambi hanno 1000 voci, ma questo è un po 'un overbid:
$ python -mtimeit -s'q=range(1000)' 'q.append(23); q.pop(0)'
1000000 loops, best of 3: 1.24 usec per loop
$ python -mtimeit -s'import collections; q=collections.deque(range(1000))' 'q.append(23); q.popleft()'
1000000 loops, best of 3: 0.573 usec per loop
python -mtimeit
è tuo amico - un approccio micro-benchmarking davvero utile e semplice! Con essa è possibile, naturalmente, anche banalmente esplorare performance in tanto piccoli casi:
$ python -mtimeit -s'q=range(100)' 'q.append(23); q.pop(0)'
1000000 loops, best of 3: 0.972 usec per loop
$ python -mtimeit -s'import collections; q=collections.deque(range(100))' 'q.append(23); q.popleft()'
1000000 loops, best of 3: 0.576 usec per loop
(non molto diverso per 12 invece di 100 articoli BTW), e in quelli molto-più grande:
$ python -mtimeit -s'q=range(10000)' 'q.append(23); q.pop(0)'
100000 loops, best of 3: 5.81 usec per loop
$ python -mtimeit -s'import collections; q=collections.deque(range(10000))' 'q.append(23); q.popleft()'
1000000 loops, best of 3: 0.574 usec per loop
Si può vedere che la richiesta di prestazioni O (1) per deque è ben fondata, mentre una lista è oltre due volte più lenta di circa 1.000 articoli, un ordine di grandezza di circa 10.000. Puoi anche vedere che anche in questi casi stai solo sprecando 5 microsecondi circa per append/pop pair e decidi quanto sia significativo lo spreco (anche se è tutto ciò che stai facendo con quel container, deque non ha svantaggi, quindi tu potrebbe anche cambiare anche se 5 usec più o meno non farà una differenza importante).
fonte
2009-08-19 02:00:10
il sottostante non continuare a crescere all'infinito (solo rimane un po 'più grande rispetto al suo "high-water mark"). Ma i problemi O (N) vs O (1) evidenziati in alcune risposte possono essere importanti. –