Optimalizace programu

Program se dá napsat mnoha způsoby, ale některé z nich nemusí být hospodárné, co se využité paměti počítače a procesoru týče. V našem případě to ještě není tolik znát, ale kdybychom naše programy testovali na obrovských objemech dat, i malá změna programu může mít velký dopad na dobu trvání výpočtu.

Příklad č. 1 - Optimalizace paměti

V tomto řešení se nám nejdříve plní seznam dvojicemi a pak se z něj stane slovník. V určitou chvíli tedy máme v paměti počítače slovník i seznam zároveň. Pokud bychom chtěli počítat opravdu hodně mocnin, může se nám stát, že se nám slovník i se seznamem do paměti nevejdou.

In [1]:
def slovnik_mocnin(n):
    seznam = []
    for x in range(1, n+1):
        seznam.append((x, x**2))
    slovnik = dict(seznam)
    return slovnik

Správné řešení, kdy nám v paměti nezůstane společně se slovníkem i seznam dvojic

V tomto řešení se nám plní slovník přímo daty a tak je tato funkce o zhruba o polovinu méně náročná na paměť.

In [2]:
def slovnik_mocnin(n):
    slovnik = {}
    for x in range(1, n+1):
        slovnik[x] = x**2
    return slovnik

Příklad č. 2 - Optimalizace počtu operací

Řádky kódu programu můžeme považovat za instrukce, které musí náš počítač vykonat. Když budeme psát programy nehospodárně, může se stát, že při počítání velkých dat se počítač hodně zapotí a program bude dlouho trvat. V tomto řešení počítáme klíče a hodnoty, ale slovník procházíme zbytečně dvakrát.

In [3]:
def vypocitej_sumu(slovnik):
    suma_klicu = 0
    suma_hodnot = 0
    for klic in slovnik:
        suma_klicu = suma_klicu + klic
    for hodnota in slovnik.values():
        suma_hodnot = suma_hodnot + hodnota
    return suma_klicu, suma_hodnot

Správné řešení, kdy nepotřebujeme procházet slovník dvakrát, ale provedeme to jen jednou

In [4]:
def vypocitej_sumu(slovnik):
    suma_klicu = 0
    suma_hodnot = 0
    for klic, hodnota in slovnik.items():
        suma_klicu = suma_klicu + klic
        suma_hodnot = suma_hodnot + hodnota
    return suma_klicu, suma_hodnot

Obecné rady a postřehy

  • Mezi jméno funkce a závorky mezeru nepíšeme
  • Pojmenovat funkci funkce opravdu není dobrý nápad
  • Více logiky programu na jedné hromadě může být lepší dát do funkce. Nemusíte psát jen funkce vyplývající ze zadání, ale i libovolné množství funkcí pomocných.
  • Pokud funkce nic nevrací, prázdný return můžeme vynechat.
  • Někdy je lepší uložit si výsledek funkce do proměnné a proměnnou použít v podmínce než napsat na jeden rádek

    if zeptej_se('Chceš přejít k další otázce? A/N'):