Niektóre odpowiedzi twierdził „10x” przewagę prędkości dla deque vs lista używane-as-FIFO, gdy oba mają 1000 wpisów, ale to trochę w przelicytować:
$ 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
jest twoim przyjacielem - naprawdę użyteczne i proste podejście do mikro-benchmarkingu! Dzięki niemu można też oczywiście trywialnie zbadać skuteczność w wielce mniejszych przypadkach:
$ 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
(nie bardzo różni się za 12 zamiast 100 pozycji BTW), w wielce większych:
$ 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
Widać, że twierdzenie o skuteczności O (1) dla deque jest uzasadnione, podczas gdy lista jest ponad dwukrotnie wolniejsza od 1000 elementów, rzędu wielkości około 10 000. Możesz także zauważyć, że nawet w takich przypadkach tracisz tylko 5 mikrosekund na parę append/pop i decydujesz, jak duże są te straty (choć jeśli to wszystko, co robisz z tym kontenerem, deque nie ma wad, więc równie dobrze może się zmienić, nawet jeśli 5 usec więcej lub mniej nie spowoduje istotnej różnicy).
instrument bazowy nie rosną w nieskończoność (tylko pozostaje nieco większe niż jego „znakiem wysokiej wody”). Ale kwestie O (N) i O (1) wyróżnione w niektórych odpowiedziach mogą być ważne. –