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

Phần mềm06 tháng 5, 2026·5 phút đọ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.

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

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 DequeVí 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().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.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗