Loeng 8: Sisseehitatud funktsioonide ülevaade, funktsiooni sulund, dekoraator ja operaator @, lausend assert, moodul ja faililaiend .py, programmi käivitamine käsurealt konsoolis, integreeritud arenduskeskkonna tutvustus ja kasutamine, kursusetöö juhend ja näidis¶

Viimati uuendatud 18.10.2025.

Lisa 1:  Rekursiivse funktsiooni optimeerimine ja funktsiooni väljakutsele kulunud aja mõõtmine¶

Puhvermälu ja dekoraatori kasutamine. Täpsema tulemuse saamiseks suurenda muutuja number = 200 väärtust.

In [1]:
import timeit  # Lausendit import pole veel õppinud.

def rec_F(n):
    '''Leiab n-da fibonacci jada liikme rekursiivselt.'''
    if n <= 2:
        return 1
    return rec_F(n - 2) + rec_F(n - 1)


cache = {}  # Tühi sõnaraamat.
def puh_F(n):
    # Kui väärtus on mälus kasutame.
    if n in cache:
        return cache[n]  # Edasi ei lähe kui tulemus leitud.
    
    # Arvutame väärtuse.
    if n <= 2:
        tulem = 1
    else:
        tulem = puh_F(n - 2) + puh_F(n - 1)  # Rekursioon.
    
    # Salvesta tulem ja väljasta vastus.
    cache[n] = tulem  # Omistan sõnaraamatu võtmele n leitud väärtuse.
    return tulem


def cacheit(func):
    cache = {}  # Tühi sõnaraamat.
    def sisemine(n):
        tulem = cache.get(n)  # Kontrollin kas sõnaraamatus on tulem.
        if tulem is None:
             tulem = cache[n] = func(n)  # Lisan puuduva tulemuse sõnaraamatusse.
        return tulem
    return sisemine  # Väljastan funktsiooni.

dec_rec_F = cacheit(rec_F)  # Dekoreerin.


@cacheit  # Dekoreerin loodud dekoraaatoriga.
def alp_dec_rec_F(n):  # Uus funktsiooni definitsioon.
    if n <= 2:
        return 1
    return alp_dec_rec_F(n - 2) + alp_dec_rec_F(n - 1)


def my_timeit(stmt, 
              setup='from __main__ import rec_F, puh_F, dec_rec_F, alp_dec_rec_F',
              number=200):
    aeg = timeit.timeit(stmt, setup=setup, number=number)
    print ('Calling {:>18} took\t {:.2f} us/execution'.format(stmt, 1e6*aeg/number))

my_timeit('rec_F(30)')       # rekursiivne,
my_timeit('puh_F(30)')        # bufferdatud, dekoreerimata.
my_timeit('dec_rec_F(30)')     # bufferdatud, dekoreeritud.
my_timeit('alp_dec_rec_F(30)')  # bufferdatud, dekoreeritud @ operaatoriga.
Calling          rec_F(30) took	 59094.29 us/execution
Calling          puh_F(30) took	 0.08 us/execution
Calling      dec_rec_F(30) took	 292.68 us/execution
Calling  alp_dec_rec_F(30) took	 0.10 us/execution

















☻   ☻   ☻