Generator Python: Iterator Hemat Memori

Pelajari cara menggunakan generator Python dan pernyataan hasil untuk memproses kumpulan data besar dengan jejak memori minimal. Ekspresi generator utama.

Coba di Editor

Ikhtisar

Saat menulis kode yang memproses ribuan atau jutaan catatan, manajemen memori menjadi sangat penting. Jika Anda memuat seluruh kumpulan data ke dalam daftar, Anda berisiko kehabisan RAM dan membuat server mogok. Generator Python mengatasi masalah ini dengan menyediakan mekanisme untuk mengalirkan data sesuai permintaan. Alih-alih menghitung dan menyimpan seluruh kumpulan data dalam memori sekaligus, generator menghasilkan satu item pada satu waktu, menyerahkannya ke pemanggil, dan menghentikan sementara eksekusi hingga item berikutnya diminta.

Generator didefinisikan seperti fungsi normal, tetapi menggunakan kata kunci `yield`, bukan `return`. Ketika fungsi generator dipanggil, ia mengembalikan objek iterator generator tanpa menjalankan pernyataan internal fungsi tersebut. Saat pemanggil memanggil `next()` pada generator (atau mengulanginya), fungsi tersebut dijalankan hingga mencapai `yield`. Pada saat itu, generator menghasilkan nilai, menyimpan variabel lokalnya, dan menunda eksekusi. Ketika dipanggil lagi, ia melanjutkan persis di tempat terakhirnya.

Anda juga dapat membuat generator menggunakan ekspresi generator, yang menggunakan sintaksis yang identik dengan pemahaman daftar tetapi dibungkus dengan tanda kurung `(...)` dan bukan tanda kurung `[...]`. Hal ini membuatnya sangat mudah untuk mengganti pemahaman daftar dengan iterator yang hemat memori. Dengan menghindari alokasi memori yang besar, generator sangat diperlukan untuk bekerja dengan log besar, mengalirkan data dari database, atau melakukan perhitungan pada urutan matematika dengan panjang tak terbatas.

Kode & Output Eksekusi

Generator khusus yang menghasilkan angka Fibonacci dan ekspresi generator hemat memori.

generators_demo.py
Coba di Editor
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))
Keluaran Terminal
--- Using Generator Function ---
0
1
1
2
3

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

Implementasi Langkah demi Langkah

  • Membaca file baris demi baris yang terlalu besar untuk RAM
  • Menghasilkan rangkaian ID atau angka matematika yang tak terbatas
  • Streaming catatan database dalam batch untuk memproses panggilan API

Pertanyaan yang Sering Diajukan

Apa perbedaan antara hasil dan pengembalian?

return mengakhiri fungsi sepenuhnya. hasil menghasilkan nilai dan menjeda fungsi, menyimpan statusnya sehingga dapat dilanjutkan saat diminta.

Apa yang terjadi jika generator kehabisan item?

Ini memunculkan pengecualian StopIteration. Di bawah perulangan 'for', Python secara otomatis mencegat pengecualian ini untuk mengakhiri perulangan dengan bersih.

Topik Terkait

Sumber Daya Python yang Direkomendasikan

Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.