Vượt Giới Hạn Của List: Tối Ưu Hiệu Suất Với Python Deque Trong Xử Lý Dữ Liệu Thời Gian Thực
Đừng lãng phí tài nguyên để dịch chuyển phần tử trong List nữa! Khám phá lý do tại sao collections.deque là bí quyết để xây dựng các cửa sổ trượt hiệu suất cao, hàng đợi an toàn luồng và xử lý luồng dữ liệu tối ưu trong các dự án Python của bạn.

Python deque (double-ended queue - hàng đợi hai đầu) là một kiểu dữ liệu collection khá đặc biệt và ít được nhắc đến hơn so với list, dictionary hay tuple. Tuy nhiên, đây lại là một công cụ cực kỳ mạnh mẽ mà mọi lập trình viên Python nên biết. Điểm khác biệt cốt lõi của deque so với các đối tượng khác là khả năng duy trì số lượng phần tử cố định: nó chỉ giữ lại số lượng mục mà bạn mong muốn, không bao giờ nhiều hơn.
Deque là gì?
Bạn có thể phát âm từ này là "deck". Về cơ bản, nó hoạt động giống như một bộ bài, tuân theo nguyên tắc FIFO (First In, First Out - Vào trước, Ra trước). Khi "bộ bài" đã đầy, nếu bạn thêm một lá bài mới vào, lá bài cũ nhất ở bên trái sẽ tự động bị loại bỏ để nhường chỗ cho lá mới được thêm vào bên phải.
Để sử dụng, trước hết bạn cần import nó từ thư viện collections:
from collections import deque
Tạo và thao tác cơ bản
Hãy tạo một deque với giới hạn tối đa là 3 phần tử:
# Tạo deque mới với tối đa 3 phần tử
my_deck = deque(maxlen=3)
# Thêm phần tử
my_deck.append(1)
my_deck.append(2)
my_deck.append(3)
# Xem kết quả
print(my_deck)
# deque([1, 2, 3])
Khi deque đã đầy, hãy quan sát điều gì xảy ra khi thêm một giá trị mới. Phần tử đầu tiên bên trái (số 1) sẽ tự động bị loại bỏ:
# Nó sẽ loại bỏ phần tử đầu tiên và thêm phần tử mới vào cuối
my_deck.append('extra')
print(my_deck)
# deque([2, 3, 'extra'])
Thao tác hai đầu
Vì là hàng đợi hai đầu, bạn hoàn toàn có thể thêm hoặc mở rộng phần tử vào phía bên trái. Lúc này, phần tử ở bên phải ngoài cùng sẽ bị loại bỏ:
# Thêm vào bên trái
my_deck.appendleft('left')
# deque(['left', 2, 3])
# Mở rộng danh sách vào bên trái
my_deck.extendleft(['d', 'd'])
# deque(['d', 'd', 'left'])
Xoay và Đảo ngược
deque cung cấp các phương thức hữu ích để xoay phần tử sang trái hoặc phải:
my_deck = deque(maxlen=3)
my_deck.extend([1,2,3]) # deque([1, 2, 3])
# Xoay phần tử sang phải 1 vị trí
my_deck.rotate() # deque([3, 1, 2])
# Xoay sang trái
my_deck.rotate(-1) # deque([1, 2, 3])
# Đảo ngược deque
my_deck.reverse()
# deque([3, 2, 1])
Xóa phần tử
Bạn có thể xóa phần tử từ trái, phải, hoặc theo giá trị cụ thể:
my_deck = deque(maxlen=3)
my_deck.extend([1, 2, 3])
# Xóa phần tử bên trái
my_deck.popleft() # deque([2, 3])
# Xóa phần tử bên phải
my_deck.pop() # deque([2])
# Xóa theo tên/giá trị
my_deck = deque([1, 'a', 3])
my_deck.remove('a') # deque([1, 3])
# Xóa tất cả
my_deck.clear() # deque([])
Ví dụ minh họa về cấu trúc dữ liệu Deque
Ứng dụng thực tế của Deque
1. Quản lý bộ nhớ với "Lịch sử tìm kiếm gần đây"
Trong khi danh sách (list) có thể phát triển vô hạn gây tốn bộ nhớ, deque có tham số maxlen. Điều này hoàn hảo cho các tính năng như "Xem gần đây" hoặc "Lịch sử tìm kiếm", nơi bạn chỉ muốn giữ lại N mục gần nhất mà không cần viết code để xóa thủ công các mục cũ.
# Chỉ giữ lại 3 lần tìm kiếm gần nhất
search_history = deque(maxlen=3)
search_history.append("Python tutorials")
search_history.append("Machine Learning")
search_history.append("Data Science")
search_history.append("Deep Learning") # "Python tutorials" tự động bị xóa
print(list(search_history))
# Output: ['Machine Learning', 'Data Science', 'Deep Learning']
2. Luồng dữ liệu trực tiếp và Trung bình trượt (Moving Averages)
Trong khoa học dữ liệu (Data Science) hoặc IoT, bạn thường cần tính trung bình trượt của một luồng dữ liệu (ví dụ: cảm biến nhiệt độ hoặc giá cổ phiếu). Sử dụng deque cho phép bạn duy trì một "cửa sổ trượt" (sliding window) dữ liệu cực kỳ hiệu quả về mặt hiệu suất.
def moving_average(stream, window_size=5):
window = deque(maxlen=window_size)
for val in stream:
window.append(val)
if len(window) == window_size:
yield sum(window) / window_size
# Ví dụ sử dụng: Tính trung bình của luồng dữ liệu cảm biến
data_stream = [20, 21, 20, 22, 23, 25, 24]
print(list(moving_average(data_stream, window_size=3)))
3. Hàng đợi đa luồng an toàn (Thread-Safe Queues)
Một trong những lợi ích "ẩn" của deque trong CPython là các thao tác .append() và .popleft() là an toàn luồng (thread-safe). Điều này làm cho nó trở thành lựa chọn tuyệt vời cho mô hình sản xuất - tiêu dùng (producer-consumer) đơn giản, nơi một luồng thêm nhiệm vụ và một luồng khác thực thi chúng.
import threading
from collections import deque
task_queue = deque()
def producer():
for i in range(5):
task_queue.append(f"Task {i}") # Thêm an toàn
def consumer():
while True:
try:
task = task_queue.popleft() # Lấy an toàn
print(f"Processing {task}")
except IndexError:
break
Kết luận
Bây giờ bạn đã biết thêm một kiểu collection Python hữu ích. Cú pháp cơ bản rất đơn giản: deque(maxlen=n), trong đó n là số lượng phần tử bạn muốn lưu trữ. Theo mặc định, nó sẽ loại bỏ phần tử bên trái khi bạn thêm một phần tử mới vào một deque đã đầy. deque chấp nhận mọi loại đối tượng như int, float, string, dataframe, v.v., và cung cấp nhiều phương thức thao tác mạnh mẽ như reverse, clear, rotate, appendleft. Đây là công cụ không thể thiếu cho các bài toán tối ưu hóa hiệu suất và xử lý dữ liệu thời gian thực.
Bài viết liên quan
Phần mềm
Lo ngại về Bun: Liệu sự suy giảm của Claude Code có phải là điềm báo cho tương lai của runtime này?
04 tháng 5, 2026

Phần mềm
Bun công bố hướng dẫn chuyển đổi sang Rust, nhưng gọi dự án viết lại là "chưa chín muồi"
05 tháng 5, 2026

Công nghệ
Startup Brox tạo ra 60.000 "bản sao kỹ thuật số" của người thật để khảo sát thị trường tức thì
06 tháng 5, 2026
