Перевірте collections.deque
. З документів:
Декели підтримують безпечне використання потоків, ефективно додає пам'ять і вискакує з обох сторін деке з приблизно однаковою продуктивністю O (1) в будь-якому напрямку.
Хоча об'єкти списку підтримують подібні операції, вони оптимізовані для швидких операцій з фіксованою довжиною та несуть витрати на переміщення пам'яті O (n) для операцій pop (0) та insert (0, v), які змінюють як розмір, так і положення основного представлення даних .
Як сказано, використання pop (0) або insert (0, v) вимагає великих покарань за об'єкти списку. Ви не можете використовувати операції зрізу / індексації на a deque
, але ви можете використовувати popleft
/ appendleft
, для яких deque
оптимізовано операції . Ось простий орієнтир для демонстрації цього:
import time
from collections import deque
num = 100000
def append(c):
for i in range(num):
c.append(i)
def appendleft(c):
if isinstance(c, deque):
for i in range(num):
c.appendleft(i)
else:
for i in range(num):
c.insert(0, i)
def pop(c):
for i in range(num):
c.pop()
def popleft(c):
if isinstance(c, deque):
for i in range(num):
c.popleft()
else:
for i in range(num):
c.pop(0)
for container in [deque, list]:
for operation in [append, appendleft, pop, popleft]:
c = container(range(num))
start = time.time()
operation(c)
elapsed = time.time() - start
print "Completed %s/%s in %.2f seconds: %.1f ops/sec" % (container.__name__, operation.__name__, elapsed, num / elapsed)
Результати на моїй машині:
Completed deque/append in 0.02 seconds: 5582877.2 ops/sec
Completed deque/appendleft in 0.02 seconds: 6406549.7 ops/sec
Completed deque/pop in 0.01 seconds: 7146417.7 ops/sec
Completed deque/popleft in 0.01 seconds: 7271174.0 ops/sec
Completed list/append in 0.01 seconds: 6761407.6 ops/sec
Completed list/appendleft in 16.55 seconds: 6042.7 ops/sec
Completed list/pop in 0.02 seconds: 4394057.9 ops/sec
Completed list/popleft in 3.23 seconds: 30983.3 ops/sec
.append()
і.pop()
амортизуються O (1) (перерозподіл та копіювання трапляються, але дуже рідко і лише до досягнення максимального розміру стека. ніколи не мали).