Optimizacije¶
MicroPython koristi nekoliko optimizacija za uštedu RAM-a, ali i za osiguravanje učinkovitog izvođenja programa. Ovo poglavlje raspravlja o nekima od tih optimizacija.
Napomena
Internalizacija nizova u MicroPythonu i Mape i rječnici detaljno opisuju druge optimizacije nad stringovima i rječnicima.
Zamrznuti bajtkod¶
Kada MicroPython učita Python kod s datotečnog sustava, prvo mora parsirati datoteku u privremenu reprezentaciju u memoriji, a zatim generirati bajtkod za izvođenje, od kojih se oboje pohranjuje na gomili (heap) (u RAM-u). To može dovesti do korištenja znatnih količina memorije. MicroPython unakrsni kompilator može se koristiti za generiranje .mpy datoteke, koja sadrži unaprijed kompilirani bajtkod za Python modul. To će se i dalje učitavati u RAM, ali izbjegava dodatne troškove faze parsiranja.
Kao daljnja optimizacija, unaprijed kompilirani bajtkod iz .mpy datoteke može se „zamrznuti” u sliku ugrađenog programa kao dio glavnog procesa kompilacije ugrađenog programa, što znači da će se bajtkod izvršavati iz ROM-a. To može dovesti do značajne uštede memorije i smanjiti fragmentaciju gomile (heap).
Više informacija potražite u MicroPython manifest datoteke.
Varijable¶
MicroPython obrađuje lokalne i globalne varijable različito. Globalne varijable pohranjuju se i traže iz globalnog rječnika koji je alociran na gomili (heap) (imajte na umu da svaki modul ima svoj zasebni rječnik, dakle zaseban imenski prostor). Lokalne varijable s druge strane pohranjuju se na Python stogu vrijednosti, koji može živjeti na C stogu ili na gomili. Njima se pristupa izravno putem njihova pomaka unutar Python stoga, što je učinkovitije od globalnog pretraživanja u rječniku.
Duljina imena globalnih varijabli također utječe na to koliko se RAM-a koristi jer se identifikatori pohranjuju u RAM. Što je identifikator kraći, to se manje memorije koristi.
Drugi aspekt je taj da se const varijable koje počinju podvlakom tretiraju kao prave konstante te se ne alociraju niti dodaju u rječnik, čime se štedi nešto memorije. Te varijable koriste const() iz MicroPython biblioteke. Stoga:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
Kompilira se u:
X = 1
foo(1, 2)
Alokacija memorije¶
Većina uobičajenih MicroPython konstrukcija ne alocira se na gomili (heap). Međutim, sljedeće se alocira:
Dinamičke strukture podataka poput lista, mapiranja itd.;
Funkcije, klase i instance objekata;
uvozi; i
Prvo pridruživanje globalnih varijabli (za stvaranje utora u globalnom rječniku).
Za detaljnu raspravu o korisnički usmjerenijoj perspektivi optimizacije, vidi Maksimiziranje brzine MicroPythona.