Bu yazıda, Python'da önbelleğe almaya değineceğiz. Ne olduğunu ve nasıl etkili şekilde kullanılacağını anlayacağız.
Önbelleğe alma, uygulama performansını iyileştirmek için program tarafından elde edilen sonuçların geçici olarak saklanması ve daha sonra gerekirse yeniden kullanılması tekniğidir.
Bu eğitimde, @lru_cache ve @cache dekoratörleri de dahil olmak üzere Python'da önbelleğe almanın farklı tekniklerini öğreneceğiz; her ikisi de functools modülünde yer alır.
Acelesi olanlar için çok kısa bir önbellek uygulamasıyla başlayalım, ardından ayrıntılara devam edelim.
Kısa Cevap: Python Önbellek Uygulaması
Python'da bir önbellek oluşturmak için functools modülündeki @cache dekoratörünü kullanabiliriz. Aşağıdaki kodda, print() fonksiyonunun yalnızca bir kez çalıştığına dikkat edin:
import functools
@functools.cachedefsquare(n):print(f"Calculating square of {n}")return n * n
# Testing the cached functionprint(square(4))print(square(4))# Calculating square of 4# 16# 16Altyapı:
Örnekle Öğren editörü, giriş yapmak için Tab tuşuna basın. Çıkmak için Escape tuşuna ve ardından Tab veya Shift+Tab tuşlarına basın.
Diyelim ki bir matematik problemini çözmemiz gerekiyor ve doğru cevabı bulmak bir saatimizi alıyor. Ertesi gün aynı problemi tekrar çözmek zorunda kalsaydık, en baştan başlamak yerine önceki çalışmamızı yeniden kullanmak faydalı olurdu.
Python'da önbelleğe alma benzer bir ilkeyi izler—fonksiyon çağrıları içinde hesaplandıklarında değerleri saklar ve bunlara tekrar ihtiyaç duyulduğunda yeniden kullanır. Bu tür önbelleğe alma, memoization olarak da adlandırılır.
Geniş bir sayı aralığının toplamını iki kez hesaplayan kısa bir örneğe bakalım:
Çıktı, her iki çağrının da kabaca aynı süreyi aldığını gösterir (kurulumumuza bağlı olarak daha hızlı veya daha yavaş yürütme süreleri elde edebiliriz).
Bununla birlikte, aynı değeri birden fazla kez hesaplamaktan kaçınmak için bir önbellek kullanabiliriz. Yerleşik functools modülündeki cache() fonksiyonunu kullanarak sum adını yeniden tanımlayabiliriz:
İkinci çağrı artık bir saniyenin üzerinde zaman almak yerine birkaç mikrosaniye sürer; çünkü 0'dan 100.000.000'a kadar olan sayıların toplamını bulmanın sonucu zaten hesaplanmış ve önbelleğe alınmıştır—ikinci çağrı, daha önce hesaplanan ve saklanan değeri kullanır.
Yukarıda, functools.cache() dekoratörünü kullanarak yerleşik sum() fonksiyonuna bir önbellek ekliyoruz. Ayrıca bir not olarak, Python'da bir dekoratör, başka bir fonksiyonun davranışını, kodunu kalıcı olarak değiştirmeden değiştiren bir fonksiyondur. Dekoratörler hakkında daha fazla bilgiyi şu Python Dekoratörleri Eğitiminde edinebilirsiniz.
functools.cache() dekoratörü Python 3.9 sürümünde eklendi, ancak daha eski sürümler için functools.lru_cache() kullanabiliriz. Sonraki bölümde, @cache gibi daha sık kullanılan dekoratör gösterimini kullanmayı da içerecek şekilde, önbellek oluşturmanın her iki yolunu inceleyeceğiz.
Python Önbelleğe Alma: Farklı Yöntemler
Python'un functools modülü, fonksiyonlara önbellek uygulamak için iki dekoratör içerir. Bir örnekle functools.lru_cache() ve functools.cache()'i inceleyelim.
sum_digits() adında, bir sayı dizisini alan ve bu sayıların basamaklarının toplamını döndüren bir fonksiyon yazalım. Örneğin, girdi olarak (23, 43, 8) demeti kullanırsak:
23'ün basamaklarının toplamı beştir.
43'ün basamaklarının toplamı yedidir.
8'in basamaklarının toplamı sekizdir.
Dolayısıyla genel toplam 20'dir.
sum_digits() fonksiyonumuzu şu şekilde yazabiliriz:
defsum_digits(numbers):returnsum(int(digit)for number in numbers for digit instr(number))
numbers =23,43,8print(sum_digits(numbers))# 20Altyapı:
Örnekle Öğren editörü, giriş yapmak için Tab tuşuna basın. Çıkmak için Escape tuşuna ve ardından Tab veya Shift+Tab tuşlarına basın.
Farklı önbellek oluşturma yollarını keşfetmek için bu fonksiyonu kullanalım.
Python'da elle önbelleğe alma
Önce önbelleği elle oluşturalım. Bunu kolayca otomatikleştirebilsek de, önbelleği elle oluşturmak süreci anlamamıza yardımcı olur.
Bir sözlük oluşturalım ve fonksiyonu her yeni değerle çağırdığımızda sonuçları depolamak için anahtar-değer çiftleri ekleyelim. Eğer fonksiyonu bu sözlükte zaten saklı bir değerle çağırırsak, fonksiyon yeniden hesaplama yapmadan saklanan değeri döndürecektir:
import random
import timeit
defsum_digits(numbers):if numbers notin sum_digits.my_cache:
sum_digits.my_cache[numbers]=sum(int(digit)for number in numbers for digit instr(number))return sum_digits.my_cache[numbers]
sum_digits.my_cache ={}
numbers =tuple(random.randint(1,1000)for _ inrange(1_000_000))print(
timeit.timeit("sum_digits(numbers)",globals=globals(),
number=1))print(
timeit.timeit("sum_digits(numbers)",globals=globals(),
number=1))Altyapı:
Örnekle Öğren editörü, giriş yapmak için Tab tuşuna basın. Çıkmak için Escape tuşuna ve ardından Tab veya Shift+Tab tuşlarına basın.
sum_digits(numbers) fonksiyonuna yapılan ikinci çağrı, önbelleğe alınmış değeri kullandığı için ilkinden çok daha hızlıdır.
Yukarıdaki kodu şimdi daha ayrıntılı açıklayalım. Öncelikle, fonksiyon içinde kullanmamıza rağmen sum_digits.my_cache sözlüğünü fonksiyonu tanımladıktan sonra oluşturduğumuza dikkat edin.
sum_digits() fonksiyonu, fonksiyona geçirilen argümanın sum_digits.my_cache sözlüğündeki anahtarlardan biri olup olmadığını kontrol eder. Tüm basamakların toplamı yalnızca argüman önbellekte yoksa hesaplanır.
Fonksiyonu çağırırken kullandığımız argüman sözlükte anahtar olarak hizmet ettiğinden, karma (hashable) bir veri türü olmalıdır. Liste hashable değildir, bu nedenle sözlükte anahtar olarak kullanılamaz. Örneğin, numbers öğesini demet yerine bir listeyle değiştirmeyi deneyelim—bu bir TypeError yükseltecektir:
# ...
numbers = [random.randint(1, 1000) for _ in range(1_000_000)]
# ...Altyapı:
Önbelleği elle oluşturmak öğrenme amaçları için harikadır, ancak şimdi bunu yapmanın daha hızlı yollarını keşfedelim.
functools.lru_cache() ile Python'da önbelleğe alma
Python, 3.2 sürümünden beri lru_cache() dekoratörüne sahiptir. Fonksiyon adının başındaki “lru”, "least recently used" (en son kullanılan) ifadesinin kısaltmasıdır. Önbelleği, sık kullanılan şeyleri saklayan bir kutu gibi düşünebiliriz—doldurduğunda, LRU stratejisi en uzun süredir kullanılmayan öğeyi atarak yenisine yer açar.
sum_digits() fonksiyonumuzu @functools.lru_cache ile süsleyelim:
import functools
import random
import timeit
@functools.lru_cachedefsum_digits(numbers):returnsum(int(digit)for number in numbers for digit instr(number))
numbers =tuple(random.randint(1,1000)for _ inrange(1_000_000))print(
timeit.timeit("sum_digits(numbers)",globals=globals(),
number=1))print(
timeit.timeit("sum_digits(numbers)",globals=globals(),
number=1))Altyapı:
Örnekle Öğren editörü, giriş yapmak için Tab tuşuna basın. Çıkmak için Escape tuşuna ve ardından Tab veya Shift+Tab tuşlarına basın.
Önbelleğe alma sayesinde, ikinci çağrı belirgin şekilde daha kısa sürede çalışır.
Varsayılan olarak, önbellek ilk 128 hesaplanan değeri saklar. Bu 128 yer dolduğunda, algoritma yeni değerlere yer açmak için en son kullanılan (LRU) değeri siler.
Fonksiyonu maxsize parametresiyle süsleyerek farklı bir maksimum önbellek boyutu belirleyebiliriz:
import functools
import random
import timeit
@functools.lru_cache(maxsize=5)
def sum_digits(numbers):
return sum(
int(digit) for number in numbers for digit in str(number)
)
# ...Altyapı:
Bu durumda önbellek yalnızca beş değer saklar. Önbelleğin boyutunu sınırlamak istemiyorsak maxsize argümanını None olarak da ayarlayabiliriz.
functools.cache() ile Python'da önbelleğe alma
Python 3.9, daha basit ve daha hızlı bir önbellek dekoratörü içerir—functools.cache(). Bu dekoratörün iki temel özelliği vardır:
Tüm fonksiyon çağrılarını ve sonuçlarını saklar (LRU stratejisini kullanmaz). Bu, nispeten küçük çıktılara sahip fonksiyonlar için ya da önbellek boyutu sınırlamalarıyla ilgilenmemiz gerekmeyen durumlar için uygundur.
sum_digits()'i @functools.cache ile süslemek, sum_digits'i functools.cache()'e atamaya denktir:
# ...
def sum_digits(numbers):
return sum(
int(digit) for number in numbers for digit in str(number)
)
sum_digits = functools.cache(sum_digits)Altyapı:
Farklı bir içe aktarma stilini de kullanabileceğimizi unutmayın:
Bu şekilde, fonksiyonlarımızı yalnızca @cache kullanarak süsleyebiliriz.
Diğer önbellekleme stratejileri
Python'un kendi araçları, en son kullanılan girdilerin yeni değerlere yer açmak için silindiği LRU önbellekleme stratejisini uygular.
Birkaç diğer önbellekleme stratejisine bakalım:
İlk giren, ilk çıkan (FIFO): Önbellek dolduğunda, yeni değerlere yer açmak için ilk eklenen öğe kaldırılır. LRU ile FIFO arasındaki fark, LRU'nun son zamanlarda kullanılan öğeleri önbellekte tutması, FIFO'nun ise kullanım durumuna bakılmaksızın en eski öğeyi atmasıdır.
Son giren, ilk çıkan (LIFO): Önbellek dolduğunda en son eklenen öğe kaldırılır. Bir kafeteryadaki tabak yığınını hayal edin. Yığına en son koyduğumuz tabak (son giren), ilk alacağımız tabaktır (ilk çıkan).
En son kullanılan (MRU): Önbellekte yer gerektiğinde, en son kullanılan değer atılır.
Rastgele değiştirme (RR): Bu strateji, yeni bir öğeye yer açmak için rastgele bir öğeyi atar.
Bu stratejiler, geçerli yaşam süresinin ölçümleriyle de birleştirilebilir—bu, önbellekteki bir verinin ne kadar süreyle geçerli veya ilgili kabul edildiğini ifade eder. Örneğin, önbellekte bir haber makalesini düşünün. Sıkça erişiliyor olabilir (LRU onu tutar), ancak bir haftanın ardından haber güncelliğini yitirebilir.
Python Önbelleğe Alma: Yaygın Kullanım Alanları
Şimdiye kadar, öğrenme amaçlı basit örnekler kullandık. Ancak önbelleğe almanın gerçek dünyada pek çok uygulaması vardır.
Veri biliminde, sıklıkla büyük veri kümeleri üzerinde tekrarlanan işlemler yürütürüz. Önbelleğe alınmış sonuçları kullanmak, aynı veri kümeleri üzerinde aynı hesaplamaları tekrar tekrar yapmanın zaman ve maliyetini azaltır.
Ayrıca dış kaynakları kaydetmek için de önbelleğe almayı kullanabiliriz; örneğin web sayfaları veya veritabanları. Bir örnek düşünelim ve bir DataCamp makalesini önbelleğe alalım. Ancak önce terminalde aşağıdaki satırı çalıştırarak üçüncü taraf requests modülünü kurmamız gerekecek:
Bir not olarak, çıktı çok uzun olduğundan kısalttık. Ancak, get_article() 'a yapılan yalnızca ilk çağrının Fetching article from {url} ifadesini yazdırdığına dikkat edin.
Bunun nedeni, web sayfasına yalnızca ilk çağrıda erişilmesidir. Sonuç, fonksiyonun önbelleğinde saklanır. Aynı web sayfasını ikinci kez istediğimizde, önbellekte saklanan veriler döndürülür.
Önbelleğe alma, aynı verileri tekrar tekrar getirirken gereksiz gecikmelerin yaşanmasını önler. Harici API'ler genellikle hız sınırlarına ve veri getirme maliyetlerine sahiptir. Önbelleğe alma, API maliyetlerini azaltır ve hız sınırlarına takılma olasılığını düşürür.
Bir diğer yaygın kullanım alanı da, bir dizi maliyetli hesaplamanın tekrarlanması gereken makine öğrenmesi uygulamalarıdır. Örneğin, bir metni bir makine öğrenmesi modelinde kullanmadan önce tokenleştirip vektörleştirmemiz gerekiyorsa, çıktıyı bir önbellekte saklayabiliriz. Böylece hesaplama açısından pahalı işlemleri tekrar etmemize gerek kalmaz.
Python'da Önbelleğe Alma Sırasında Yaygın Zorluklar
Python'da önbelleğe almanın avantajlarını öğrendik. Bir önbellek uygularken akılda tutulması gereken bazı zorluklar ve sakıncalar da vardır:
Önbellek geçersiz kılma ve tutarlılık: Veriler zamanla değişebilir. Bu nedenle, önbellekte saklanan değerlerin de güncellenmesi veya kaldırılması gerekebilir.
Bellek yönetimi: Büyük miktarda veriyi önbellekte saklamak bellek gerektirir ve önbellek sınırsız büyürse performans sorunlarına yol açabilir.
Karmaşıklık: Önbellek eklemek, önbelleği oluştururken ve sürdürürken sisteme karmaşıklık katar. Çoğu zaman faydalar bu maliyetleri aşsa da, artan bu karmaşıklık bulunması ve düzeltilmesi zor hatalara yol açabilir.
Sonuç
Aynı veriler üzerinde hesaplama açısından yoğun işlemler tekrarlanıyorsa, performansı iyileştirmek için önbelleğe alma kullanabiliriz.
Python'da, fonksiyon çağrılarında önbellek oluşturmak için functools modülünde yer alan @lru_cache ve @cache olmak üzere iki dekoratör bulunur.
Yine de, önbelleği güncel tuttuğumuzdan ve belleği düzgün yönettiğimizden emin olmamız gerekir.
Önbelleğe alma ve Python hakkında daha fazla öğrenmek isterseniz, altı dersten oluşan şu Python Programming yetkinlik yoluna göz atın.
Malta Üniversitesi’nde lisans düzeyinde Fizik ve Matematik okudum. Ardından Londra’ya taşındım ve Imperial College’da Fizik alanında doktoramı tamamladım. İnsan retinasını görüntülemek için yeni optik teknikler üzerine çalıştım. Şimdi Python hakkında yazmaya, Python’u anlatmaya ve Python öğretmeye odaklanıyorum.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Bu yazıda, Python'da önbelleğe almaya değineceğiz. Ne olduğunu ve nasıl etkili şekilde kullanılacağını anlayacağız.
Önbelleğe alma, uygulama performansını iyileştirmek için program tarafından elde edilen sonuçların geçici olarak saklanması ve daha sonra gerekirse yeniden kullanılması tekniğidir.
Bu eğitimde,
@lru_cacheve@cachedekoratörleri de dahil olmak üzere Python'da önbelleğe almanın farklı tekniklerini öğreneceğiz; her ikisi defunctoolsmodülünde yer alır.Acelesi olanlar için çok kısa bir önbellek uygulamasıyla başlayalım, ardından ayrıntılara devam edelim.
Kısa Cevap: Python Önbellek Uygulaması
Python'da bir önbellek oluşturmak için
functoolsmodülündeki@cachedekoratörünü kullanabiliriz. Aşağıdaki kodda,print()fonksiyonunun yalnızca bir kez çalıştığına dikkat edin:Python'da Önbelleğe Alma Nedir?
Diyelim ki bir matematik problemini çözmemiz gerekiyor ve doğru cevabı bulmak bir saatimizi alıyor. Ertesi gün aynı problemi tekrar çözmek zorunda kalsaydık, en baştan başlamak yerine önceki çalışmamızı yeniden kullanmak faydalı olurdu.
Python'da önbelleğe alma benzer bir ilkeyi izler—fonksiyon çağrıları içinde hesaplandıklarında değerleri saklar ve bunlara tekrar ihtiyaç duyulduğunda yeniden kullanır. Bu tür önbelleğe alma, memoization olarak da adlandırılır.
Geniş bir sayı aralığının toplamını iki kez hesaplayan kısa bir örneğe bakalım:
Program her seferinde toplamı yeniden hesaplamak zorundadır. Bunu iki çağrıyı zamanlayarak doğrulayabiliriz:
Çıktı, her iki çağrının da kabaca aynı süreyi aldığını gösterir (kurulumumuza bağlı olarak daha hızlı veya daha yavaş yürütme süreleri elde edebiliriz).
Bununla birlikte, aynı değeri birden fazla kez hesaplamaktan kaçınmak için bir önbellek kullanabiliriz. Yerleşik
functoolsmodülündekicache()fonksiyonunu kullanaraksumadını yeniden tanımlayabiliriz:İkinci çağrı artık bir saniyenin üzerinde zaman almak yerine birkaç mikrosaniye sürer; çünkü 0'dan 100.000.000'a kadar olan sayıların toplamını bulmanın sonucu zaten hesaplanmış ve önbelleğe alınmıştır—ikinci çağrı, daha önce hesaplanan ve saklanan değeri kullanır.
Yukarıda,
functools.cache()dekoratörünü kullanarak yerleşiksum()fonksiyonuna bir önbellek ekliyoruz. Ayrıca bir not olarak, Python'da bir dekoratör, başka bir fonksiyonun davranışını, kodunu kalıcı olarak değiştirmeden değiştiren bir fonksiyondur. Dekoratörler hakkında daha fazla bilgiyi şu Python Dekoratörleri Eğitiminde edinebilirsiniz.functools.cache()dekoratörü Python 3.9 sürümünde eklendi, ancak daha eski sürümler içinfunctools.lru_cache()kullanabiliriz. Sonraki bölümde,@cachegibi daha sık kullanılan dekoratör gösterimini kullanmayı da içerecek şekilde, önbellek oluşturmanın her iki yolunu inceleyeceğiz.Python Önbelleğe Alma: Farklı Yöntemler
Python'un
functoolsmodülü, fonksiyonlara önbellek uygulamak için iki dekoratör içerir. Bir örneklefunctools.lru_cache()vefunctools.cache()'i inceleyelim.sum_digits()adında, bir sayı dizisini alan ve bu sayıların basamaklarının toplamını döndüren bir fonksiyon yazalım. Örneğin, girdi olarak(23, 43, 8)demeti kullanırsak:23'ün basamaklarının toplamı beştir.43'ün basamaklarının toplamı yedidir.8'in basamaklarının toplamı sekizdir.sum_digits()fonksiyonumuzu şu şekilde yazabiliriz:Farklı önbellek oluşturma yollarını keşfetmek için bu fonksiyonu kullanalım.
Python'da elle önbelleğe alma
Önce önbelleği elle oluşturalım. Bunu kolayca otomatikleştirebilsek de, önbelleği elle oluşturmak süreci anlamamıza yardımcı olur.
Bir sözlük oluşturalım ve fonksiyonu her yeni değerle çağırdığımızda sonuçları depolamak için anahtar-değer çiftleri ekleyelim. Eğer fonksiyonu bu sözlükte zaten saklı bir değerle çağırırsak, fonksiyon yeniden hesaplama yapmadan saklanan değeri döndürecektir:
sum_digits(numbers)fonksiyonuna yapılan ikinci çağrı, önbelleğe alınmış değeri kullandığı için ilkinden çok daha hızlıdır.Yukarıdaki kodu şimdi daha ayrıntılı açıklayalım. Öncelikle, fonksiyon içinde kullanmamıza rağmen
sum_digits.my_cachesözlüğünü fonksiyonu tanımladıktan sonra oluşturduğumuza dikkat edin.sum_digits()fonksiyonu, fonksiyona geçirilen argümanınsum_digits.my_cachesözlüğündeki anahtarlardan biri olup olmadığını kontrol eder. Tüm basamakların toplamı yalnızca argüman önbellekte yoksa hesaplanır.Fonksiyonu çağırırken kullandığımız argüman sözlükte anahtar olarak hizmet ettiğinden, karma (hashable) bir veri türü olmalıdır. Liste hashable değildir, bu nedenle sözlükte anahtar olarak kullanılamaz. Örneğin,
numbersöğesini demet yerine bir listeyle değiştirmeyi deneyelim—bu birTypeErroryükseltecektir:Önbelleği elle oluşturmak öğrenme amaçları için harikadır, ancak şimdi bunu yapmanın daha hızlı yollarını keşfedelim.
functools.lru_cache() ile Python'da önbelleğe alma
Python, 3.2 sürümünden beri
lru_cache()dekoratörüne sahiptir. Fonksiyon adının başındaki “lru”, "least recently used" (en son kullanılan) ifadesinin kısaltmasıdır. Önbelleği, sık kullanılan şeyleri saklayan bir kutu gibi düşünebiliriz—doldurduğunda, LRU stratejisi en uzun süredir kullanılmayan öğeyi atarak yenisine yer açar.sum_digits()fonksiyonumuzu@functools.lru_cacheile süsleyelim:Önbelleğe alma sayesinde, ikinci çağrı belirgin şekilde daha kısa sürede çalışır.
Varsayılan olarak, önbellek ilk 128 hesaplanan değeri saklar. Bu 128 yer dolduğunda, algoritma yeni değerlere yer açmak için en son kullanılan (LRU) değeri siler.
Fonksiyonu
maxsizeparametresiyle süsleyerek farklı bir maksimum önbellek boyutu belirleyebiliriz:Bu durumda önbellek yalnızca beş değer saklar. Önbelleğin boyutunu sınırlamak istemiyorsak
maxsizeargümanınıNoneolarak da ayarlayabiliriz.functools.cache() ile Python'da önbelleğe alma
Python 3.9, daha basit ve daha hızlı bir önbellek dekoratörü içerir—
functools.cache(). Bu dekoratörün iki temel özelliği vardır:functools.lru_cache(maxsize=None)çağrısına benzer.sum_digits()fonksiyonunda@functools.cachedekoratörünü kullanalım:sum_digits()'i@functools.cacheile süslemek,sum_digits'ifunctools.cache()'e atamaya denktir:Farklı bir içe aktarma stilini de kullanabileceğimizi unutmayın:
Bu şekilde, fonksiyonlarımızı yalnızca
@cachekullanarak süsleyebiliriz.Diğer önbellekleme stratejileri
Python'un kendi araçları, en son kullanılan girdilerin yeni değerlere yer açmak için silindiği LRU önbellekleme stratejisini uygular.
Birkaç diğer önbellekleme stratejisine bakalım:
Bu stratejiler, geçerli yaşam süresinin ölçümleriyle de birleştirilebilir—bu, önbellekteki bir verinin ne kadar süreyle geçerli veya ilgili kabul edildiğini ifade eder. Örneğin, önbellekte bir haber makalesini düşünün. Sıkça erişiliyor olabilir (LRU onu tutar), ancak bir haftanın ardından haber güncelliğini yitirebilir.
Python Önbelleğe Alma: Yaygın Kullanım Alanları
Şimdiye kadar, öğrenme amaçlı basit örnekler kullandık. Ancak önbelleğe almanın gerçek dünyada pek çok uygulaması vardır.
Veri biliminde, sıklıkla büyük veri kümeleri üzerinde tekrarlanan işlemler yürütürüz. Önbelleğe alınmış sonuçları kullanmak, aynı veri kümeleri üzerinde aynı hesaplamaları tekrar tekrar yapmanın zaman ve maliyetini azaltır.
Ayrıca dış kaynakları kaydetmek için de önbelleğe almayı kullanabiliriz; örneğin web sayfaları veya veritabanları. Bir örnek düşünelim ve bir DataCamp makalesini önbelleğe alalım. Ancak önce terminalde aşağıdaki satırı çalıştırarak üçüncü taraf
requestsmodülünü kurmamız gerekecek:requestskurulduktan sonra, aynı DataCamp makalesini iki kez getirmeye çalışan ve@lru_cachedekoratörünü kullanan aşağıdaki kodu deneyebiliriz:Bir not olarak, çıktı çok uzun olduğundan kısalttık. Ancak,
get_article()'a yapılan yalnızca ilk çağrınınFetching article from {url}ifadesini yazdırdığına dikkat edin.Bunun nedeni, web sayfasına yalnızca ilk çağrıda erişilmesidir. Sonuç, fonksiyonun önbelleğinde saklanır. Aynı web sayfasını ikinci kez istediğimizde, önbellekte saklanan veriler döndürülür.
Önbelleğe alma, aynı verileri tekrar tekrar getirirken gereksiz gecikmelerin yaşanmasını önler. Harici API'ler genellikle hız sınırlarına ve veri getirme maliyetlerine sahiptir. Önbelleğe alma, API maliyetlerini azaltır ve hız sınırlarına takılma olasılığını düşürür.
Bir diğer yaygın kullanım alanı da, bir dizi maliyetli hesaplamanın tekrarlanması gereken makine öğrenmesi uygulamalarıdır. Örneğin, bir metni bir makine öğrenmesi modelinde kullanmadan önce tokenleştirip vektörleştirmemiz gerekiyorsa, çıktıyı bir önbellekte saklayabiliriz. Böylece hesaplama açısından pahalı işlemleri tekrar etmemize gerek kalmaz.
Python'da Önbelleğe Alma Sırasında Yaygın Zorluklar
Python'da önbelleğe almanın avantajlarını öğrendik. Bir önbellek uygularken akılda tutulması gereken bazı zorluklar ve sakıncalar da vardır:
Sonuç
Aynı veriler üzerinde hesaplama açısından yoğun işlemler tekrarlanıyorsa, performansı iyileştirmek için önbelleğe alma kullanabiliriz.
Python'da, fonksiyon çağrılarında önbellek oluşturmak için
functoolsmodülünde yer alan@lru_cacheve@cacheolmak üzere iki dekoratör bulunur.Yine de, önbelleği güncel tuttuğumuzdan ve belleği düzgün yönettiğimizden emin olmamız gerekir.
Önbelleğe alma ve Python hakkında daha fazla öğrenmek isterseniz, altı dersten oluşan şu Python Programming yetkinlik yoluna göz atın.