Optimalisaties¶
MicroPython gebruikt verschillende optimalisaties om RAM te besparen maar ook om de efficiënte uitvoering van programma’s te garanderen. Dit hoofdstuk bespreekt enkele van deze optimalisaties.
Notitie
String-interning in MicroPython en Maps en dictionaries beschrijven andere optimalisaties op strings en dictionaries.
Bevroren bytecode¶
Wanneer MicroPython Python-code uit het bestandssysteem laadt, moet het het bestand eerst parsen tot een tijdelijke in-memory representatie en vervolgens bytecode genereren voor uitvoering, beide worden opgeslagen in de heap (in RAM). Dit kan leiden tot aanzienlijke hoeveelheden gebruikt geheugen. De MicroPython cross-compiler kan worden gebruikt om een .mpy-bestand te genereren dat de voorgecompileerde bytecode voor een Python-module bevat. Dit wordt nog steeds in RAM geladen, maar het vermijdt de extra overhead van de parsefase.
Als verdere optimalisatie kan de voorgecompileerde bytecode uit een .mpy-bestand worden “bevroren” in de firmware-image als onderdeel van het hoofd-firmwarecompilatieproces, wat betekent dat de bytecode vanuit ROM zal worden uitgevoerd. Dit kan leiden tot een aanzienlijke geheugenbesparing en de fragmentatie van de heap verminderen.
Zie MicroPython manifest-bestanden voor meer informatie.
Variabelen¶
MicroPython verwerkt lokale en globale variabelen verschillend. Globale variabelen worden opgeslagen in en opgezocht uit een globale dictionary die op de heap wordt toegewezen (merk op dat elke module zijn eigen aparte dict heeft, en dus een aparte namespace). Lokale variabelen daarentegen worden opgeslagen op de Python-waardestack, die op de C-stack of op de heap kan leven. Ze worden rechtstreeks benaderd via hun offset binnen de Python-stack, wat efficiënter is dan een globale opzoeking in een dict.
De lengte van globale variabelenamen beïnvloedt ook hoeveel RAM wordt gebruikt, aangezien identifiers in RAM worden opgeslagen. Hoe korter de identifier, hoe minder geheugen wordt gebruikt.
Een ander aspect is dat const-variabelen die met een underscore beginnen, als echte constanten worden behandeld en niet worden toegewezen of toegevoegd aan een dictionary, waardoor wat geheugen wordt bespaard. Deze variabelen gebruiken const() uit de MicroPython-bibliotheek. Daarom:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
Compileert naar:
X = 1
foo(1, 2)
Toewijzing van geheugen¶
De meeste van de gangbare MicroPython-constructies worden niet op de heap toegewezen. De volgende echter wel:
Dynamische datastructuren zoals lijsten, mappings, enz.;
Functies, klassen en objectinstanties;
imports; en
Eerste toewijzing van globale variabelen (om de slot in de globale dict aan te maken).
Voor een gedetailleerde bespreking vanuit een meer gebruikersgericht perspectief op optimalisatie, zie MicroPython-snelheid maximaliseren.