Optimierungen

MicroPython verwendet mehrere Optimierungen, um RAM zu sparen, aber auch um die effiziente Ausführung von Programmen sicherzustellen. Dieses Kapitel behandelt einige dieser Optimierungen.

Bemerkung

String-Interning in MicroPython und Maps und Dictionaries beschreiben weitere Optimierungen für Strings und Dictionaries.

Eingefrorener Bytecode

Wenn MicroPython Python-Code aus dem Dateisystem lädt, muss es die Datei zunächst in eine temporäre In-Memory-Darstellung parsen und dann Bytecode für die Ausführung erzeugen, die beide im Heap (im RAM) gespeichert werden. Dies kann zu einer erheblichen Speichernutzung führen. Mit dem MicroPython-Cross-Compiler kann eine .mpy-Datei erzeugt werden, die den vorkompilierten Bytecode für ein Python-Modul enthält. Diese wird zwar weiterhin in den RAM geladen, vermeidet aber den zusätzlichen Aufwand der Parsing-Phase.

Als weitere Optimierung kann der vorkompilierte Bytecode aus einer .mpy-Datei im Rahmen des Haupt-Firmware-Kompilierungsprozesses in das Firmware-Image „eingefroren“ werden, was bedeutet, dass der Bytecode aus dem ROM ausgeführt wird. Dies kann zu erheblichen Speichereinsparungen führen und die Heap-Fragmentierung reduzieren.

Weitere Informationen finden Sie unter MicroPython-Manifest-Dateien.

Variablen

MicroPython verarbeitet lokale und globale Variablen unterschiedlich. Globale Variablen werden in einem globalen Dictionary gespeichert und nachgeschlagen, das auf dem Heap zugewiesen wird (beachten Sie, dass jedes Modul sein eigenes separates Dict und somit einen eigenen Namensraum hat). Lokale Variablen hingegen werden auf dem Python-Wertestapel gespeichert, der auf dem C-Stack oder auf dem Heap leben kann. Auf sie wird direkt über ihren Offset innerhalb des Python-Stacks zugegriffen, was effizienter ist als ein globaler Lookup in einem Dict.

Die Länge der Namen globaler Variablen beeinflusst ebenfalls, wie viel RAM verwendet wird, da Bezeichner im RAM gespeichert werden. Je kürzer der Bezeichner, desto weniger Speicher wird verwendet.

Der andere Aspekt ist, dass const-Variablen, die mit einem Unterstrich beginnen, als echte Konstanten behandelt und nicht in einem Dictionary zugewiesen oder hinzugefügt werden, wodurch etwas Speicher gespart wird. Diese Variablen verwenden const() aus der MicroPython-Bibliothek. Daher:

from micropython import const

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

Kompiliert zu:

X = 1
foo(1, 2)

Speicherzuweisung

Die meisten der gängigen MicroPython-Konstrukte werden nicht auf dem Heap zugewiesen. Die folgenden jedoch schon:

  • Dynamische Datenstrukturen wie Listen, Mappings usw.;

  • Funktionen, Klassen und Objektinstanzen;

  • Imports; und

  • Erstmalige Zuweisung globaler Variablen (um den Slot im globalen Dict zu erstellen).

Eine ausführliche Diskussion einer eher nutzerzentrierten Perspektive auf die Optimierung finden Sie unter Maximierung der MicroPython-Geschwindigkeit.