Kiểm tra collections.deque
. Từ các tài liệu:
Deques hỗ trợ an toàn luồng, gắn và bật bộ nhớ hiệu quả từ hai bên của deque với hiệu suất xấp xỉ O (1) ở cả hai hướng.
Mặc dù các đối tượng danh sách hỗ trợ các hoạt động tương tự, chúng được tối ưu hóa cho các hoạt động có độ dài cố định nhanh và phát sinh chi phí di chuyển bộ nhớ O (n) cho các hoạt động pop (0) và insert (0, v) thay đổi cả kích thước và vị trí của biểu diễn dữ liệu cơ bản .
Đúng như nó nói, việc sử dụng pop (0) hoặc insert (0, v) phải chịu những hình phạt lớn với các đối tượng danh sách. Bạn không thể sử dụng các thao tác lát / chỉ mục trên a deque
, nhưng bạn có thể sử dụng popleft
/ appendleft
, là các thao tác deque
được tối ưu hóa cho. Đây là một tiêu chuẩn đơn giản để chứng minh điều này:
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)
Kết quả trên máy của tôi:
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()
và.pop()
được khấu hao O (1) (việc phân bổ lại và sao chép xảy ra, nhưng rất hiếm và chỉ cho đến khi bạn đạt đến kích thước tối đa thì ngăn xếp sẽ đã từng có).