Python Jeneratörleri: Bellek Açısından Verimli Yineleyiciler

Çok büyük veri kümelerini minimum bellek alanıyla işlemek için Python oluşturucularını ve verim ifadelerini nasıl kullanacağınızı öğrenin. Ana oluşturucu ifadeleri.

Editör'de deneyin

Genel Bakış

Binlerce veya milyonlarca kaydı işleyen kod yazarken bellek yönetimi kritik hale gelir. Veri kümesinin tamamını bir listeye yüklerseniz, RAM'inizin bitmesi ve sunucunun çökmesi riskiyle karşı karşıya kalırsınız. Python Jeneratörleri, isteğe bağlı olarak veri akışı sağlayan bir mekanizma sağlayarak bu sorunu çözer. Veri setinin tamamını bir kerede hesaplamak ve hafızada saklamak yerine, bir oluşturucu her seferinde bir öğe üretir, onu arayana verir ve bir sonraki öğe istenene kadar yürütülmesini duraklatır.

Jeneratörler normal işlevler gibi tanımlanır, ancak 'dönüş' yerine 'verim' anahtar kelimesini kullanırlar. Bir üreteç işlevi çağrıldığında, işlevin dahili ifadelerini yürütmeden bir üreteç yineleyici nesnesi döndürür. Arayan kişi jeneratörde "next()"i çağırdığında (veya bunun üzerinden döngü yaptığında), işlev "verim"e ulaşana kadar yürütülür. Bu noktada oluşturucu değeri verir, yerel değişkenlerini kaydeder ve yürütmeyi askıya alır. Tekrar arandığında kaldığı yerden devam eder.

Ayrıca, liste kavramalarıyla aynı söz dizimini kullanan ancak parantez '[...]' yerine parantez '(...)' içine alınmış oluşturucu ifadeleri kullanarak oluşturucular oluşturabilirsiniz. Bu, liste kavramalarını bellek açısından verimli yineleyicilerle değiştirmeyi inanılmaz derecede kolaylaştırır. Büyük bellek tahsislerinden kaçınan jeneratörler, büyük günlüklerle çalışmak, veritabanlarından veri akışı yapmak veya sonsuz uzunluktaki matematiksel diziler üzerinde hesaplamalar yapmak için vazgeçilmezdir.

Kod ve Yürütme Çıkışı

Fibonacci sayılarını ve hafıza açısından verimli bir oluşturucu ifadesini veren özel bir oluşturucu.

generators_demo.py
Editör'de deneyin
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))
Terminal Çıkışı
--- Using Generator Function ---
0
1
1
2
3

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

Adım Adım Uygulama

  • RAM için fazla büyük olan dosyaları satır satır okuma
  • Sonsuz sayıda kimlik veya matematik rakamı dizisi oluşturma
  • API çağrılarını işlemek için veritabanı kayıtlarını toplu olarak yayınlama

Sıkça Sorulan Sorular

Verim ve getiri arasındaki fark nedir?

return işlevi tamamen sonlandırır. verim bir değer verir ve işlevi duraklatır, istendiğinde devam edebilmesi için durumunu kaydeder.

Bir jeneratörde öğe kalmadığında ne olur?

Bir StopIteration istisnası oluşturur. Bir 'for' döngüsü altında Python, döngüyü temiz bir şekilde sonlandırmak için bu istisnayı otomatik olarak keser.

İlgili Konular

Önerilen Python Kaynakları

İlgili etkileşimli eğitimler, yardımcı sayfalar ve kod karşılaştırmalarıyla bilginizi genişletin.