Optimalizace¶
MicroPython používá několik optimalizací pro úsporu RAM, ale také pro zajištění efektivního provádění programů. Tato kapitola pojednává o některých z těchto optimalizací.
Poznámka
Internace řetězců v MicroPythonu a Mapy a slovníky podrobně popisují další optimalizace řetězců a slovníků.
Zmrazený bytecode¶
Když MicroPython načítá kód Python ze souborového systému, musí nejprve soubor naparsovat do dočasné reprezentace v paměti a poté vygenerovat bytecode pro provádění, přičemž obojí je uloženo na haldě (v RAM). To může vést k využití značného množství paměti. Křížový kompilátor MicroPythonu lze použít k vygenerování souboru .mpy obsahujícího předkompilovaný bytecode pro modul Python. Ten bude stále načítán do RAM, ale vyhne se dodatečné režii fáze parsování.
Jako další optimalizaci lze předkompilovaný bytecode ze souboru .mpy „zmrazit“ do obrazu firmware jako součást hlavního procesu kompilace firmware, což znamená, že se bytecode bude provádět z ROM. To může vést ke značné úspoře paměti a snížit fragmentaci haldy.
Více informací najdete v Soubory manifestu MicroPython.
Proměnné¶
MicroPython zpracovává lokální a globální proměnné odlišně. Globální proměnné jsou ukládány a vyhledávány z globálního slovníku, který je alokován na haldě (mějte na paměti, že každý modul má svůj vlastní oddělený slovník, tedy oddělený jmenný prostor). Lokální proměnné jsou naopak ukládány na hodnotovém zásobníku Pythonu, který se může nacházet na zásobníku C nebo na haldě. Přistupuje se k nim přímo pomocí jejich offsetu v rámci zásobníku Pythonu, což je efektivnější než globální vyhledávání ve slovníku.
Délka názvů globálních proměnných také ovlivňuje, kolik RAM se využije, protože identifikátory jsou uloženy v RAM. Čím kratší identifikátor, tím méně paměti se použije.
Dalším aspektem je, že proměnné const začínající podtržítkem jsou považovány za skutečné konstanty a nejsou alokovány ani přidávány do slovníku, čímž se ušetří určité množství paměti. Tyto proměnné používají const() z knihovny MicroPython. Proto:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
Zkompiluje se na:
X = 1
foo(1, 2)
Alokace paměti¶
Většina běžných konstrukcí MicroPythonu není alokována na haldě. Následující však ano:
Dynamické datové struktury jako seznamy, mapování atd.;
Funkce, třídy a instance objektů;
importy; a
První přiřazení globálních proměnných (pro vytvoření slotu v globálním slovníku).
Podrobnější diskuzi o optimalizaci z více uživatelsky orientovaného pohledu najdete v Maximalizace rychlosti MicroPythonu.