Hogyan tudunk futási időt csökkenteni többlet memória felhasználásával?

Tegyük fel, hogy olyan műveletet kell végezni a programunknak, amely érzékelhető futási idő növekedéssel jár, és ráadásul ezt többször is végre kell hajtani. Ha ez a művelet determinisztikus, vagyis ugyanarra a bemenő adatra vagy kérésre mindig ugyanazt a kimenő adatot, illetve választ adja, akkor alkalmazhatjuk az úgynevezett memoizációt. Ez lényegét tekintve azt jelenti, hogy adott kérésekre egyszer már meghatározott eredményeket eltároljuk a memóriában, és egy újabb kérés esetén nem a jelentős futási idejű műveletet hatjuk végre megint, hanem egyszerűen a memóriában tárolt megfelelő értéket adjuk vissza.

A memoizáció tehát lényegében az időfelhasználást konvertálja memóriafelhasználássá.

Ez a technika annál nagyobb futási idő megtakarítást eredményez (és annál kevesebb többlet memóriafelhasználást igényel), minél gyakrabban kell ugyanazon bemenetre a válaszokat megkapni.

A memoizációt több módon is meg lehet valósítani. Az egyik gyakori mód a closure alkalmazása. Ennek bemutatását látjuk az alábbi példaprogramban.

Az egyszerűség és áttekinthetőség kedvéért a bemutatott closure függvény adott egész szám hatványát számoló függvényt jelent, ahol a hatványalapot a körülzáró függvény q argumentumával határozzuk meg a meghívásakor. A hatványszámolás nem lassú, ezért ahhoz, hogy egy érzékelhető futási idő növekményt érjünk el, azt a szabványos könyvtár time moduljának sleep() függvényével szimuláljuk, aminek argumentumaként másodpercben mérve kell megadni a késleltetési időt.

A hatványértékeket a körülzáró függvény lokális változójával hivatkozott list típusú sorozatban tároljuk. Mint tudjuk (lásd egy korábbi bejegyzésben is) a closure függvény e lokális változó értékéhez bárhol a programban a hívása helyén is hozzá tud férni. Ha még nincs az adott egész számhoz eltárolt hatványértéke, akkor azt kiszámolja, és ebben a listába eltárolja. Ha pedig az adott indexhez van már tárolt érték, akkor azzal tér vissza.

Ez a példa csak az elvet hivatott bemutatni. A memoizálással és annak megvalósításával kapcsolatban még merülnek fel részletkérdések. Ezekkel mélyebben a Python tudásépítés lépésről lépésre című e-könyv „Tár-idő csereügylet – memoizálás a futási idő csökkentésére”, valamint a „Memoizálás támogatása” fejezetek foglalkoznak.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.