Optimalizációk

A MicroPython számos optimalizációt használ a RAM megtakarítására, de a programok hatékony végrehajtásának biztosítására is. Ez a fejezet ezek közül néhány optimalizációt tárgyal.

Megjegyzés

A MicroPython sztring-internálás és a Leképezések és szótárak a sztringekre és a szótárakra vonatkozó további optimalizációkat részletezi.

Befagyasztott bájtkód

Amikor a MicroPython Python kódot tölt be a fájlrendszerből, először elemeznie kell a fájlt egy ideiglenes, memóriában tárolt reprezentációvá, majd bájtkódot kell generálnia a végrehajtáshoz, és mindkettő a kupacon (a RAM-ban) tárolódik. Ez jelentős mennyiségű memória felhasználásához vezethet. A MicroPython keresztfordító használható egy .mpy fájl generálására, amely egy Python modul előre lefordított bájtkódját tartalmazza. Ez továbbra is betöltődik a RAM-ba, de elkerüli az elemzési szakasz további terhelését.

További optimalizációként a .mpy fájlból származó, előre lefordított bájtkód „befagyasztható” a firmware-képbe a fő firmware fordítási folyamatának részeként, ami azt jelenti, hogy a bájtkód a ROM-ból fog végrehajtódni. Ez jelentős memóriamegtakarításhoz vezethet, és csökkenti a kupac töredezettségét.

További információért lásd: MicroPython manifest fájlok.

Változók

A MicroPython a lokális és a globális változókat eltérően kezeli. A globális változók egy globális szótárban tárolódnak és onnan kerülnek kikeresésre, amely a kupacon van lefoglalva (megjegyzendő, hogy minden modulnak saját külön szótára, tehát külön névtere van). A lokális változók ezzel szemben a Python értékveremben tárolódnak, amely a C vermen vagy a kupacon élhet. Ezek közvetlenül, a Python vermen belüli eltolásuk szerint érhetők el, ami hatékonyabb, mint egy globális kikeresés egy szótárban.

A globális változónevek hossza is befolyásolja, mennyi RAM-ot használ a rendszer, mivel az azonosítók a RAM-ban tárolódnak. Minél rövidebb az azonosító, annál kevesebb memória használódik.

A másik szempont, hogy azok a const változók, amelyek aláhúzással kezdődnek, valódi konstansként kezelődnek, és nem foglalódnak le, illetve nem kerülnek be egy szótárba, ezáltal némi memóriát megtakarítva. Ezek a változók a MicroPython könyvtár const() függvényét használják. Ezért:

from micropython import const

X = const(1)
_Y = const(2)
foo(X, _Y)

Erre fordul:

X = 1
foo(1, 2)

Memóriafoglalás

A legtöbb gyakori MicroPython konstrukció nem foglalódik le a kupacon. A következők azonban igen:

  • Dinamikus adatszerkezetek, mint listák, leképezések stb.;

  • Függvények, osztályok és objektumpéldányok;

  • importok; és

  • Globális változók első hozzárendelése (a hely létrehozásához a globális szótárban).

Az optimalizáció felhasználóközpontúbb nézőpontjáról szóló részletes tárgyalásért lásd: A MicroPython sebességének maximalizálása.