Python Üreteçler (Generator) ve yield ile Bellek Tasarrufu
Generator, bir kere birer birer değer üreten özel bir fonksiyondur. Normal fonksiyonlar tüm sonuçları bir kere hesaplar ve return ile geri dönerken, generatorlar yield kullanarak her çağrıda bir sonraki değeri verir. Bu sayede bellekte sadece o anki değer tutulur, milyonlarca veri ile çalışırken muazzam tasarruf sağlarsınız.
Bir liste oluşturduğunuzda, range(1000000) gibi işlemlerde tüm sayılar bellekte saklanır. Generator ise sadece istenen sayıyı üretir. Örneğin def sayı_üret(): ile bir generator tanımlarsanız, her next() çağrısında bir sonraki değer gelir.
Yield anahtar kelimesi generator'un kalbidir. Return yerine yield kullanırsanız, fonksiyon bir generator nesnesi döner. İlk çağrıda ilk yield'e kadar çalışır, ikinci çağrıda oradan devam eder.
Aşağıdaki kodu çalıştırın:
1def fibonacci(n):2a, b = 0, 13for _ in range(n):4yield a5a, b = b, a + b67# Generator kullanımı8for sayi in fibonacci(10):9print(sayi, end=' ')Çıktı: 0 1 1 2 3 5 8 13 21 34
Bu kod bellekte sadece iki sayı tutar. Eğer liste yaparsanız list(fibonacci(10)), tüm 10 sayı bellekte birden saklanır.
Büyük dosyaları satır satır okumak için generator kullanın:
1def dosya_oku(dosya_adı):2with open(dosya_adı, 'r') as f:3for satır in f:4yield satır.strip()56# Kullanım7for satır in dosya_oku('veri.txt'):8print(satır)Bu şekilde 1 GB dosya bile rahat işlenir, çünkü bellekte sadece bir satır vardır.
Listeleri generator'a çevirmek için parantez kullanın:
1# Liste (bellekte tüm değerler)2kare_listesi = [x**2 for x in range(1000000)]34# Generator (sadece istenen değer)5kare_gen = (x**2 for x in range(1000000))67print(next(kare_gen)) # 08print(next(kare_gen)) # 19print(next(kare_gen)) # 4Generator'lar büyük veri işlerken, API'den veri çekerken ve dosya okurken hayat kurtarır. Bellek kullanımı önemli olduğunda yield düşünün.
0 yorum