Optimeringar¶
MicroPython använder flera optimeringar för att spara RAM men också för att säkerställa effektiv exekvering av program. Detta kapitel diskuterar några av dessa optimeringar.
Anteckning
Stränginternering i MicroPython och Mappar och ordböcker beskriver andra optimeringar av strängar och dictionaries.
Frusen bytekod¶
När MicroPython laddar Python-kod från filsystemet måste den först tolka filen till en tillfällig representation i minnet, och sedan generera bytekod för exekvering, vilka båda lagras i heapen (i RAM). Detta kan leda till att betydande mängder minne används. MicroPythons korskompilator kan användas för att generera en .mpy-fil, som innehåller den förkompilerade bytekoden för en Python-modul. Denna kommer fortfarande att laddas in i RAM, men den undviker den extra omkostnaden för tolkningssteget.
Som en ytterligare optimering kan den förkompilerade bytekoden från en .mpy-fil ”frysas” in i firmware-avbildningen som en del av den huvudsakliga firmware-kompileringsprocessen, vilket innebär att bytekoden kommer att exekveras från ROM. Detta kan leda till en betydande minnesbesparing och minska heap-fragmentering.
Se MicroPython-manifestfiler för mer information.
Variabler¶
MicroPython behandlar lokala och globala variabler olika. Globala variabler lagras och slås upp från ett globalt dictionary som allokeras på heapen (observera att varje modul har sitt eget separata dict, alltså separat namnrymd). Lokala variabler å andra sidan lagras på Pythons värdestack, som kan ligga på C-stacken eller på heapen. De nås direkt via sin offset inom Python-stacken, vilket är mer effektivt än en global uppslagning i ett dict.
Längden på globala variabelnamn påverkar också hur mycket RAM som används eftersom identifierare lagras i RAM. Ju kortare identifieraren är, desto mindre minne används.
Den andra aspekten är att const-variabler som börjar med ett understreck behandlas som riktiga konstanter och allokeras inte eller läggs till i ett dictionary, vilket sparar lite minne. Dessa variabler använder const() från MicroPython-biblioteket. Därför:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
Kompileras till:
X = 1
foo(1, 2)
Allokering av minne¶
De flesta av de vanliga MicroPython-konstruktionerna allokeras inte på heapen. Följande gör dock det:
Dynamiska datastrukturer som listor, mappningar osv;
Funktioner, klasser och objektinstanser;
importer; och
Första tilldelningen av globala variabler (för att skapa platsen i det globala dict:et).
För en detaljerad diskussion ur ett mer användarcentrerat perspektiv på optimering, se Maximising MicroPython speed.