Memoisation in Python
Konumuz memoisation("ingilizce - memoization") 1968 yılında sakallı bir adam tarafından keşfedilmiştir. Bu sakallı adamın adı Donald Michie'dir. Kelimenin kökü latinceden "memorandum" dan gelir ve "Hatırlamak, bir şeyi hatırlama" anlamlarından gelir. Memoisation program akışını hızlandırmak için bir tekniktir. Bu işlem ile sonucları elde ettikten sonra saklayabilir-kaydedebilirsiniz. Mesela fonksiyon çağırmalarında, vereceğim örnekler ile zaten daha kolay anlayacaksınız. Mesela diyelim bir fonksiyonu aynı parametreler ile bir daha çağırıyorsunuz, bu fonksiyonu tekrar hesaplamak yerine, bellekte kaydettiği değer üstünden hesaplar. "Peki zaten sonuçları herhangi bir diziye zaten kaydederiz ordan okuturuz" diyecek olan arkadaşlara ilerde daha karmaşık durumlarda ve bir şirket ile resmi olarak çalıştığınızda bu tekniğe o kadar ihtiyacınız olacak kii. Memoisation programcı tarafından açık bir şekilde kodlanilabilir ama Python gibi dillerde memoisation uygulamasını kolaylaştırmak için mekanizmaları vardır.
Bir önceki konum Rekursion() ' da 1 adet iterative 1 adet rekursive fonksiyon tanımlamıştım, fibonacci sayılarını hesaplamak için.
Biz burda gostermistik nasil rekursion ile fonksiyonumuzu hizlandirabiliriz diye. Memoisation isleminde fonksiyon islem gorurken sonraki cagirmalarda daha hizli olmasi icin bir nevi bellekte yer tutar. Acikcasi Memoisation tekniginin nasil kullanacagina iliskin bir ornekti ama biz boyle adlandirmamistik. Bu yontemin tek dezavantaji Rekursion isleminin netligine ve guzelligini kaybetmesine sebep olmasi. Assagida ki kod fib fonksiyonumuzu degistirmez boylece okunabirligi, netligi etkilenmez. Bu amacla memoize() adli bir fonksiyon kullaniyoruz 2 arguman alir. Sonra memo adli bir sozluk olusturuyoruz degerimizi kaydetmesi icin. Yardimci helper olarak bir degisken tanimlayalim ve bize degeri dondursun. Biz bu fonksiyonu memoize(fib) seklinde cagirdigimiz zaman bize fib fonksiyonumuzdaki giris ve cikis degerlerini verir.
Evet burada fib fonksiyonumuzu Memoisation tarafindan dekore edildigini goruyoruz.
Tabii ki biz bir class olusturup sonuclari oradan dondurup, kaydedebiliriz ornek olarak ;
Onemli not ;
Burda bir sozluk kullandik normal mutable arguman kullanamayiz. Sadece immutable argumanlarini kullanabiliriz Tupel gibi.
Decorateure Python ;
Gercek objelerimiz yani degistirilecek olan objelerimiz arguman olarak verilir. Dekorateur degistirilmis objeyi geri dondurur. Yani ornegin degistirilmemis bir fonksiyon degistirilmis diger objenin adiyla degistirilir. Python Dekorateure'un Syntax'i direk java gibidir. Pythonun sozdizimi bu konuda seker gibi gorunur @ kullanilarak.
Cok dekorateurdan bahsettim ama sunu soylemedim bu yazimin en basinda verdigim ornek memoisationda "def memoize(f):" fonksiyonunun Dekorateur oldugunu soylemedim galiba. Ama biz o ornekte Pythonun Dekorateur-Syntax'ini kullanmadik yani @ isaretini.
Basitlestirilmis su kullanimi kullanabiliriz ;
Ancak bu komut dekorize edilecek fonksiyondan once kullanilmalidir.!
Ve yazimin sonuna gelirken fib fonksiyonumuz komple halini atalim ;
Unutmadan fonksiyon Negative,float sayilar ile cagirilmamalidir, eger cagirirsaniz sonsuz donguye sokabilirsiniz. Evet simdi konumuzu bagdastirmak icin sayinin Pozitiv olup olmadiginini test edip tam sayi ise faktoriyelini hesaplasin ornegini yapalim. Ama Dekorize edilmis hali ile
Evet bir makalemin daha sonuna geldik yine mobilde oldugum icin ve ne yazikki Turkce klavyem bozuldugu icin yazim kurallarina dikkat edemedim. Eger bir yerde yanlisim var ise duzeltiniz lutfen, yanlis yapa yapa dogruyu ogrenmek akilda birakir memoisation hesabi
Dekorateure = Dekorator
Decoration = Dekorasyon
Ne kadar surc-i lisan ettiysek affola.
Konumuz memoisation("ingilizce - memoization") 1968 yılında sakallı bir adam tarafından keşfedilmiştir. Bu sakallı adamın adı Donald Michie'dir. Kelimenin kökü latinceden "memorandum" dan gelir ve "Hatırlamak, bir şeyi hatırlama" anlamlarından gelir. Memoisation program akışını hızlandırmak için bir tekniktir. Bu işlem ile sonucları elde ettikten sonra saklayabilir-kaydedebilirsiniz. Mesela fonksiyon çağırmalarında, vereceğim örnekler ile zaten daha kolay anlayacaksınız. Mesela diyelim bir fonksiyonu aynı parametreler ile bir daha çağırıyorsunuz, bu fonksiyonu tekrar hesaplamak yerine, bellekte kaydettiği değer üstünden hesaplar. "Peki zaten sonuçları herhangi bir diziye zaten kaydederiz ordan okuturuz" diyecek olan arkadaşlara ilerde daha karmaşık durumlarda ve bir şirket ile resmi olarak çalıştığınızda bu tekniğe o kadar ihtiyacınız olacak kii. Memoisation programcı tarafından açık bir şekilde kodlanilabilir ama Python gibi dillerde memoisation uygulamasını kolaylaştırmak için mekanizmaları vardır.
Bir önceki konum Rekursion() ' da 1 adet iterative 1 adet rekursive fonksiyon tanımlamıştım, fibonacci sayılarını hesaplamak için.
Kod:
def fib(n):
Kod:
[B] if n == 0:[/B]
[B] return 0[/B]
[B] elif n == 1:[/B]
[B] return 1[/B]
[B] else: return fib(n-1) + fib(n-2)[/B]
Biz burda gostermistik nasil rekursion ile fonksiyonumuzu hizlandirabiliriz diye. Memoisation isleminde fonksiyon islem gorurken sonraki cagirmalarda daha hizli olmasi icin bir nevi bellekte yer tutar. Acikcasi Memoisation tekniginin nasil kullanacagina iliskin bir ornekti ama biz boyle adlandirmamistik. Bu yontemin tek dezavantaji Rekursion isleminin netligine ve guzelligini kaybetmesine sebep olmasi. Assagida ki kod fib fonksiyonumuzu degistirmez boylece okunabirligi, netligi etkilenmez. Bu amacla memoize() adli bir fonksiyon kullaniyoruz 2 arguman alir. Sonra memo adli bir sozluk olusturuyoruz degerimizi kaydetmesi icin. Yardimci helper olarak bir degisken tanimlayalim ve bize degeri dondursun. Biz bu fonksiyonu memoize(fib) seklinde cagirdigimiz zaman bize fib fonksiyonumuzdaki giris ve cikis degerlerini verir.
Kod:
def memoize(f):
Kod:
[B] memo = {}[/B]
[B] def helper(x):[/B]
[B] if x not in memo: [/B]
[B] memo[x] = f(x)[/B]
[B] return memo[x][/B]
[B] return helper[/B]
[B]def fib(n):[/B]
[B] if n == 0:[/B]
[B] return 0[/B]
[B] elif n == 1:[/B]
[B] return 1[/B]
[B] else:[/B]
[B] return fib(n-1) + fib(n-2)[/B]
[B]fib = memoize(fib)[/B]
[B]print(fib(40))[/B]
Evet burada fib fonksiyonumuzu Memoisation tarafindan dekore edildigini goruyoruz.
Tabii ki biz bir class olusturup sonuclari oradan dondurup, kaydedebiliriz ornek olarak ;
Kod:
class Memoize:
Kod:
[B] def __init__(self, fn):[/B]
[B] self.fn = fn[/B]
[B] self.memo = {}[/B]
[B] def __call__(self, *args):[/B]
[B] if args not in self.memo:[/B]
[B] self.memo[args] = self.fn(*args)[/B]
[B] return self.memo[args][/B]
Onemli not ;
Burda bir sozluk kullandik normal mutable arguman kullanamayiz. Sadece immutable argumanlarini kullanabiliriz Tupel gibi.
Decorateure Python ;
Gercek objelerimiz yani degistirilecek olan objelerimiz arguman olarak verilir. Dekorateur degistirilmis objeyi geri dondurur. Yani ornegin degistirilmemis bir fonksiyon degistirilmis diger objenin adiyla degistirilir. Python Dekorateure'un Syntax'i direk java gibidir. Pythonun sozdizimi bu konuda seker gibi gorunur @ kullanilarak.
Cok dekorateurdan bahsettim ama sunu soylemedim bu yazimin en basinda verdigim ornek memoisationda "def memoize(f):" fonksiyonunun Dekorateur oldugunu soylemedim galiba. Ama biz o ornekte Pythonun Dekorateur-Syntax'ini kullanmadik yani @ isaretini.
Kod:
fib = memoize(fib)
Basitlestirilmis su kullanimi kullanabiliriz ;
Kod:
@memoize
Ancak bu komut dekorize edilecek fonksiyondan once kullanilmalidir.!
Ve yazimin sonuna gelirken fib fonksiyonumuz komple halini atalim ;
Kod:
def memoize(f):
Kod:
[B] memo = {}[/B]
[B] def helper(x):[/B]
[B] if x not in memo: [/B]
[B] memo[x] = f(x)[/B]
[B] return memo[x][/B]
[B] return helper[/B]
[B]@memoize[/B]
[B]def fib(n):[/B]
[B] if n == 0:[/B]
[B] return 0[/B]
[B] elif n == 1:[/B]
[B] return 1[/B]
[B] else:[/B]
[B] return fib(n-1) + fib(n-2)[/B]
[B]#fib = memoize(fib)[/B]
[B]print(fib(40))[/B]
Unutmadan fonksiyon Negative,float sayilar ile cagirilmamalidir, eger cagirirsaniz sonsuz donguye sokabilirsiniz. Evet simdi konumuzu bagdastirmak icin sayinin Pozitiv olup olmadiginini test edip tam sayi ise faktoriyelini hesaplasin ornegini yapalim. Ama Dekorize edilmis hali ile
Kod:
def arguman_dogal_sayi_testi(f):
Kod:
[B] def helper(x):[/B]
[B] if type(x) == int and x > 0:[/B]
[B] return f(x)[/B]
[B] else:[/B]
[B] raise Exception("Arguman integer degil")[/B]
[B] return helper[/B]
[B]@arguman_dogal_sayi_testi[/B]
[B]def factorial(n):[/B]
[B] if n == 1:[/B]
[B] return 1[/B]
[B] else:[/B]
[B] return n * factorial(n-1)[/B]
[B]for i in range(1,10):[/B]
[B] print(i, factorial(i))[/B]
[B]print(factorial(-1))[/B]
Evet bir makalemin daha sonuna geldik yine mobilde oldugum icin ve ne yazikki Turkce klavyem bozuldugu icin yazim kurallarina dikkat edemedim. Eger bir yerde yanlisim var ise duzeltiniz lutfen, yanlis yapa yapa dogruyu ogrenmek akilda birakir memoisation hesabi
Dekorateure = Dekorator
Decoration = Dekorasyon
Ne kadar surc-i lisan ettiysek affola.
Son düzenleme: