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.