Trình tạo Python: Trình lặp hiệu quả về bộ nhớ
Tìm hiểu cách sử dụng trình tạo Python và câu lệnh lợi nhuận để xử lý các tập dữ liệu khổng lồ với mức sử dụng bộ nhớ tối thiểu. Biểu thức của trình tạo chính.
Tổng quan
Khi viết mã xử lý hàng nghìn hoặc hàng triệu bản ghi, việc quản lý bộ nhớ trở nên quan trọng. Nếu bạn tải toàn bộ tập dữ liệu vào danh sách, bạn có nguy cơ hết RAM và làm hỏng máy chủ. Trình tạo Python giải quyết vấn đề này bằng cách cung cấp cơ chế truyền dữ liệu theo yêu cầu. Thay vì tính toán và lưu trữ toàn bộ tập dữ liệu trong bộ nhớ cùng một lúc, trình tạo sẽ tạo ra một mục mỗi lần, đưa nó cho người gọi và tạm dừng thực thi cho đến khi mục tiếp theo được yêu cầu.
Trình tạo được định nghĩa giống như các hàm thông thường, nhưng chúng sử dụng từ khóa `yield` thay vì `return`. Khi một hàm tạo được gọi, nó trả về một đối tượng trình lặp trình tạo mà không thực thi các câu lệnh bên trong của hàm. Khi người gọi gọi `next()` trên trình tạo (hoặc lặp qua nó), hàm sẽ thực thi cho đến khi đạt `yield`. Tại thời điểm đó, trình tạo tạo ra giá trị, lưu các biến cục bộ của nó và tạm dừng thực thi. Khi được gọi lại, nó sẽ tiếp tục chính xác ở nơi nó đã dừng lại.
Bạn cũng có thể tạo trình tạo bằng cách sử dụng biểu thức trình tạo, sử dụng cú pháp giống hệt với phần hiểu danh sách nhưng được gói trong dấu ngoặc đơn `(...)` thay vì dấu ngoặc `[...]`. Điều này giúp việc thay thế khả năng hiểu danh sách bằng các trình vòng lặp hiệu quả về bộ nhớ trở nên cực kỳ dễ dàng. Bằng cách tránh phân bổ bộ nhớ lớn, các trình tạo là không thể thiếu để làm việc với các nhật ký lớn, truyền dữ liệu từ cơ sở dữ liệu hoặc thực hiện các phép tính trên các chuỗi toán học có độ dài vô hạn.
Đầu ra mã & thực thi
Trình tạo tùy chỉnh mang lại số Fibonacci và biểu thức trình tạo hiệu quả về bộ nhớ.
def fibonacci_generator(limit):
"""Yields Fibonacci numbers up to the limit."""
a, b = 0, 1
count = 0
while count < limit:
yield a
a, b = b, a + b
count += 1
# Instantiate generator
fib = fibonacci_generator(5)
print("--- Using Generator Function ---")
for num in fib:
print(num)
# Generator expression (squares of numbers)
squares_gen = (x**2 for x in range(1, 1000000))
print("\n--- Using Generator Expression ---")
print(next(squares_gen))
print(next(squares_gen))
print(next(squares_gen))--- Using Generator Function ---
0
1
1
2
3
--- Using Generator Expression ---
1
4
9Triển khai từng bước
- Đọc từng dòng một tệp quá lớn so với RAM
- Tạo chuỗi ID hoặc số liệu toán học vô hạn
- Truyền các bản ghi cơ sở dữ liệu theo đợt để xử lý lệnh gọi API
Câu hỏi thường gặp
Sự khác biệt giữa năng suất và lợi nhuận là gì?
return chấm dứt chức năng hoàn toàn. mang lại một giá trị và tạm dừng hàm, lưu trạng thái của nó để nó có thể tiếp tục khi được yêu cầu.
Điều gì xảy ra khi máy phát điện hết vật phẩm?
Nó đưa ra một ngoại lệ StopIteration. Trong vòng lặp 'for', Python tự động chặn ngoại lệ này để chấm dứt vòng lặp một cách rõ ràng.
Chủ đề liên quan
Tìm hiểu cách sử dụng vòng lặp Python để lặp lại dữ liệu. Nắm vững các phương pháp hay nhất về vòng lặp for, while, ngắt, tiếp tục và lặp bằng các ví dụ tương tác.
Hiểu biết về PythonViết Python sạch hơn, nhanh hơn. Danh sách chính, từ điển và khả năng hiểu tập hợp với các ví dụ thực tế, điều kiện lọc và vòng lặp lồng nhau.
Python ItertoolsTìm hiểu mô-đun itertools của Python. Làm chủ các trình lặp vô hạn, tổ hợp, hoán vị, nhóm và xử lý dữ liệu hiệu quả về bộ nhớ.
Tài nguyên Python được đề xuất
Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.
Cách sử dụng Trình tạo trong Python
Tìm hiểu cách viết trình tạo bằng Python. Hiểu từ khóa lợi nhuận, đánh giá lười biếng, tối ưu hóa bộ nhớ và so sánh các trình tạo với cấu trúc danh sách.
Bảng cheat phương thức chuỗi Python
Hướng dẫn tham khảo đầy đủ về thao tác chuỗi Python. Làm chủ định dạng, tìm kiếm, phân tách, thay thế và kiểm tra thuộc tính chuỗi.
Python vs JavaScript: Ngôn ngữ lập trình nào tốt nhất?
So sánh toàn diện giữa Python và JavaScript. Khám phá sự khác biệt về cú pháp, hiệu suất, trường hợp sử dụng (phụ trợ so với giao diện người dùng) và các ví dụ về mã hóa.