"Talebe göre hesaplama" veya tembel hesaplamalar, işlenen veri miktarının artmasıyla popüler hale geldi. Python'da bu mekanizmalar, standart kütüphanede, jeneratörler ve yinelemeler aracılığıyla, daha sonra ise itertools fonksiyonu ve talep üzerine birer öğe döndürebilen sınıflar aracılığıyla gerçekleştirildi, böylece tüm verilerin aynı anda bellekte saklanmasından kaçınıldı.
Standart koleksiyon oluşturma işlemleri, tüm sonucun belleğe yüklenmesini gerektirir. Boyut büyükse, program "çöker" veya çok yavaş çalışabilir. Veri akışlarını işleyebilmek önemlidir - örneğin, birkaç gigabaytlık dosyalar veya API'ye yapılan sorguların sonuçları.
Tembel hesaplamalar, ihtiyaç duyuldukça elemanları almaya olanak tanır. Python'da bu, jeneratörlerin, yield sözdiziminin, jeneratör ifadelerinin, map, filter, zip fonksiyonlarının ve itertools modülünün kullanılmasıyla kolaylaştırılmıştır. Bu yaklaşım, yinelemeli protokollere dayanır.
Kod örneği:
def huge_sequence(): for i in range(1, 10**9): yield i * i for val in huge_sequence(): if val > 100: break print(val)
Anahtar noktalar:
Python'daki jeneratörler her zaman bellek tasarrufu sağlar mı?
Cevap: Hayır, yalnızca veriler gerçekten aşama arasında ara bellekte saklanmayı gerektirmediğinde. Bazı yapılar, örneğin list comprehensions, tüm listeyi hemen oluşturur, oysa jeneratörler sadece talep üzerine. Ara sonuçlar yine de gerekli ise, tasarruf kaybedilir.
Örnek:
squares = (x**2 for x in range(10**8)) # tembel, tasarruflu result = list(squares) # hemen tüm belleği kaplar
map ve filter her zaman listeler mi döndürür?
Hayır, Python 3'te map ve filter liste değil, bir yineleyici (tembel jeneratör) döndürür, bu da bellek tasarrufu sağlar ve verileri "anlık" işlemeye imkan tanır.
Jeneratör üzerinde çok sayıda yineleme yapmak mümkün mü?
Hayır, jeneratör tam bir döngüden sonra "biter". Tekrar geçiş gerekiyorsa, yeni bir jeneratör oluşturmak veya içeriği birden fazla kez döngüye alınabilecek bir konteyner koleksiyonu kullanmak gereklidir.
Bir geliştirici, büyük bir log dosyasını, satırların listesini belleğe yükleyerek işlemeye çalışıyor.
Artılar:
Eksiler:
Jeneratör kullanılıyor - dosyadan satır satır okuyarak, her satırı aldıkça işleme.
Artılar:
Eksiler: