Khi xử lý dữ liệu lớn — hàng triệu dòng, file khổng lồ — việc nạp hết vào bộ nhớ là bất khả thi. Generator giải quyết bài toán này bằng cách sinh dữ liệu “khi cần”.
Generator là gì?
Generator là hàm dùng từ khóa yield thay vì return. Nó không tính hết mọi giá trị ngay, mà sinh từng giá trị một khi được yêu cầu.
def dem(n):
i = 0
while i < n:
yield i # "trả về" tạm thời, giữ trạng thái
i += 1
for so in dem(5):
print(so) # 0 1 2 3 4
Tiết kiệm bộ nhớ
# List: tạo cả triệu phần tử trong bộ nhớ
tong = sum([x*x for x in range(1_000_000)])
# Generator: sinh từng phần tử, gần như không tốn bộ nhớ
tong = sum(x*x for x in range(1_000_000))
Chỉ khác dấu ngoặc, nhưng generator xử lý được dữ liệu lớn hơn nhiều mà không "ngốn" RAM.
Đọc file lớn từng dòng
def doc_dong(ten_file):
with open(ten_file, encoding="utf-8") as f:
for dong in f:
yield dong.strip()
Đặc điểm quan trọng
- Generator chỉ duyệt được một lần.
- Sinh giá trị lười biếng (lazy) — chỉ khi cần.
- Lý tưởng cho luồng dữ liệu (stream) và dữ liệu vô hạn.
Khi bạn thấy mình xử lý dữ liệu lớn và lo về bộ nhớ, generator thường là câu trả lời gọn gàng nhất.
