Memoisation, decoration() Python.

ALcatraz'

Kıdemli Üye
30 May 2013
4,338
4
İstanbul
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.

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:

ALcatraz'

Kıdemli Üye
30 May 2013
4,338
4
İstanbul
Anlayabiliyorum Dostum açıklaman için teşekkürler
Kodları güncellediğinizde bilgi verirseniz sevinirim

Evet bakınız bir yanlıs anlama daha decoration ettiğimiz objeler @memoize den sonra fonksiyona bir nevi bağlanır ve orada tanımladığımız argümanı bizim yardımcı fonksiyonumuzda ki argümana eşitler. Ve bize aynı isimde bir argüman döndürür. Kodlarda her hangi bir sıkıntı yok yani.
 

ihan3t

Kadim Üye
7 Şub 2012
5,018
21
Hocam anlamadjğım nokta helper fonksiyonuna verilen x parametresine hangi argüman geliyor yani x'e attanan değeri ne belirliyor

Elinize sağlık bu arada

x e atanan değer şöyle geliyor, aslında decorator method inner methodu return ediyor, ve decoratorü kullanan method un parametresi bu inner method a geçiyor.

Decorator kullanımı şuna eşit :

my_dec_func = memoize(fib) //burada inner method return ediliyor

my_dec_func(5) //inner methoda parametre olarak geçiliyor

Aslında şu konuyu okursan kafanda netleşir her şey : https://www.thecodeship.com/patterns/guide-to-python-function-decorators/

Ek olarak first class function kavramını araştırırsan biraz daha oturur kafanda.
 

nS4f3

Üye
3 Haz 2017
92
0
Evet bakınız bir yanlıs anlama daha decoration ettiğimiz objeler @memoize den sonra fonksiyona bir nevi bağlanır ve orada tanımladığımız argümanı bizim yardımcı fonksiyonumuzda ki argümana eşitler. Ve bize aynı isimde bir argüman döndürür. Kodlarda her hangi bir sıkıntı yok yani.

Anladım yani n parametresine verdiğimiz değer @memoize ile x parametresine argüman olarak veriliyor yani
 

nS4f3

Üye
3 Haz 2017
92
0
x e atanan değer şöyle geliyor, aslında decorator method inner methodu return ediyor, ve decoratorü kullanan method un parametresi bu inner method a geçiyor.

Decorator kullanımı şuna eşit :

my_dec_func = memoize(fib) //burada inner method return ediliyor

my_dec_func(5) //inner methoda parametre olarak geçiliyor

Aslında şu konuyu okursan kafanda netleşir her şey : https://www.thecodeship.com/patterns/guide-to-python-function-decorators/

Ek olarak first class function kavramını araştırırsan biraz daha oturur kafanda.
Anladım hocam yani memoize(fib(10)) değeri önce fib() func. fib(10) için bir değer döndürüyor daha sonra bu değeri de helper() foksiyonuna argüman olarak atıyor
Doğru söyledim değil mi?
Teşekkürler. Hocam
 

ALcatraz'

Kıdemli Üye
30 May 2013
4,338
4
İstanbul
x e atanan değer şöyle geliyor, aslında decorator method inner methodu return ediyor, ve decoratorü kullanan method un parametresi bu inner method a geçiyor.

Decorator kullanımı şuna eşit :

my_dec_func = memoize(fib) //burada inner method return ediliyor

my_dec_func(5) //inner methoda parametre olarak geçiliyor

Aslında şu konuyu okursan kafanda netleşir her şey : https://www.thecodeship.com/patterns/guide-to-python-function-decorators/

Ek olarak first class function kavramını araştırırsan biraz daha oturur kafanda.

Ihmm :jeerat

Teşekkürler hepinize :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.