İPUCU

Python Artificial Intelligence’da en çok kullanılan dildir ve gerekli dökümanların paylaşım alanlar burada paylaşılmaktadır.

Seçenekler

Memoisation, decoration() Python.

ALcatraz' - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
05/2013
Nereden:
İstanbul
Mesajlar:
4.266
Konular:
1022
Teşekkür (Etti):
968
Teşekkür (Aldı):
1757
Ticaret:
(0) %
27-07-2017 22:58
#1
Memoisation, decoration() Python.
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:
    if n == 0:
        return 0
    elif n == 1:
    return 1
    else: return fib(n-1) + fib(n-2)
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:
    memo = {}
    def helper(x):
        if x not in memo:            
            memo[x] = f(x)
        return memo[x]
    return helper


def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

fib = memoize(fib)

print(fib(40))
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:
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
    def __call__(self, *args):
        if args not in self.memo:
                self.memo[args] = self.fn(*args)
        return self.memo[args]
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:
    memo = {}
    def helper(x):
        if x not in memo:            
            memo[x] = f(x)
        return memo[x]
    return helper

@memoize
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

#fib = memoize(fib)

print(fib(40))
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:
    def helper(x):
        if type(x) == int and x > 0:
                return f(x)
        else:
                raise Exception("Arguman integer degil")
    return helper

@arguman_dogal_sayi_testi
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

for i in range(1,10):
    print(i, factorial(i))

print(factorial(-1))
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.


---------------------
En çok ne zoruma gidiyor biliyor musun? "Ülkem" diye kaydetmiştin beni telefonuna. Kalbimi parçalara ayırdın, hani vatan bölünmezdi?

Yokluğun bilinç altımdayken , varlığın kimin altında merak ediyorum.
Konu ALcatraz' tarafından (28-07-2017 01:45 Saat 01:45 ) değiştirilmiştir.
YouKnowWho, Hacknology, xAesir Teşekkür etti.
CyberNeeG - ait Kullanıcı Resmi (Avatar)
Tamamen Forumdan Uzaklaştırıldı
Üyelik tarihi:
01/2016
Nereden:
777
Mesajlar:
1.158
Konular:
48
Teşekkür (Etti):
169
Teşekkür (Aldı):
156
Ticaret:
(0) %
27-07-2017 23:31
#2
Eline sağlık üstad.
ALcatraz' - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
05/2013
Nereden:
İstanbul
Mesajlar:
4.266
Konular:
1022
Teşekkür (Etti):
968
Teşekkür (Aldı):
1757
Ticaret:
(0) %
28-07-2017 01:12
#3
Alıntı:
nS4f3´isimli üyeden Alıntı Mesajı göster
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.
---------------------
En çok ne zoruma gidiyor biliyor musun? "Ülkem" diye kaydetmiştin beni telefonuna. Kalbimi parçalara ayırdın, hani vatan bölünmezdi?

Yokluğun bilinç altımdayken , varlığın kimin altında merak ediyorum.
ihan3t - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
02/2012
Mesajlar:
5.005
Konular:
255
Teşekkür (Etti):
291
Teşekkür (Aldı):
1831
Ticaret:
(0) %
28-07-2017 01:18
#4
Alıntı:
nS4f3´isimli üyeden Alıntı Mesajı göster
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...on-decorators/

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

Senior Software Engineer.
ALcatraz' Teşekkür etti.
nS4f3 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2017
Mesajlar:
92
Konular:
4
Teşekkür (Etti):
32
Teşekkür (Aldı):
11
Ticaret:
(0) %
28-07-2017 07:23
#5
Alıntı:
ALcatraz'´isimli üyeden Alıntı Mesajı göster
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
---------------------
The Grass is always The Greener
on The OTHER SİDE...
nS4f3 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2017
Mesajlar:
92
Konular:
4
Teşekkür (Etti):
32
Teşekkür (Aldı):
11
Ticaret:
(0) %
28-07-2017 07:35
#6
Alıntı:
ihan3t´isimli üyeden Alıntı Mesajı göster
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...on-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
---------------------
The Grass is always The Greener
on The OTHER SİDE...
Hacknology - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
10/2015
Nereden:
rm -rf /
Mesajlar:
2.710
Konular:
151
Teşekkür (Etti):
947
Teşekkür (Aldı):
1233
Ticaret:
(0) %
28-07-2017 08:33
#7
Ellerine sağlık alcatraz. Okurken zevk aldım
---------------------
I surrender my soul
Odin hear my call

flag{Bur4si_b1r_0yun_park1}

hacknology@hacknologyroot:~/
ALcatraz' Teşekkür etti.
MatWeapon - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
01/2017
Mesajlar:
85
Konular:
3
Teşekkür (Etti):
5
Teşekkür (Aldı):
5
Ticaret:
(0) %
28-07-2017 12:16
#8
Eline sağlık.

Güncel.
--------------------- ASUS ROG G752VS-GB166T
->6.TH GEN i7-6820HK
->64GB DDR4 2133MHZ SDRAM
->1TB 7.2K SSHD + 512GB 850EVO
->8GB GTX 1070 // 4K IPS MAT
Bade Perest - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
06/2017
Yaş:
99
Mesajlar:
1.696
Konular:
137
Teşekkür (Etti):
365
Teşekkür (Aldı):
251
Ticaret:
(0) %
28-07-2017 12:28
#9
Eline saglık.guzel anlatım olmuş.
ALcatraz' - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
05/2013
Nereden:
İstanbul
Mesajlar:
4.266
Konular:
1022
Teşekkür (Etti):
968
Teşekkür (Aldı):
1757
Ticaret:
(0) %
28-07-2017 12:42
#10
Alıntı:
ihan3t´isimli üyeden Alıntı Mesajı göster
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...on-decorators/

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

Teşekkürler hepinize
---------------------
En çok ne zoruma gidiyor biliyor musun? "Ülkem" diye kaydetmiştin beni telefonuna. Kalbimi parçalara ayırdın, hani vatan bölünmezdi?

Yokluğun bilinç altımdayken , varlığın kimin altında merak ediyorum.

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı