확인하십시오 collections.deque
. 문서에서 :
Deques는 어느 방향 으로든 거의 동일한 O (1) 성능으로 deque의 양쪽에서 스레드로부터 안전한 메모리 효율적인 추가 및 팝을 지원합니다.
목록 객체는 유사한 작업을 지원하지만 빠른 고정 길이 작업에 최적화되어 있으며 기본 데이터 표현의 크기와 위치를 모두 변경하는 pop (0) 및 insert (0, v) 작업에 대해 O (n) 메모리 이동 비용이 발생합니다. .
말했듯이 pop (0) 또는 insert (0, v)를 사용하면 목록 객체에 큰 불이익이 발생합니다. 에서 슬라이스 / 인덱스 작업을 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) (재 할당 및 복사가 발생하지만, 아주 드물게 만 때까지 최대. 크기를 스택에 도달하지가 않습니다 적).