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.

Thử trong Trình chỉnh sửa

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))
Đầu ra thiết bị đầu cuối
--- Using Generator Function ---
0
1
1
2
3

--- Using Generator Expression ---
1
4
9

Triể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à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.