Optimizări

MicroPython folosește mai multe optimizări pentru a economisi memorie RAM, dar și pentru a asigura execuția eficientă a programelor. Acest capitol discută unele dintre aceste optimizări.

Notă

Internarea șirurilor în MicroPython și Hărți și dicționare detaliază alte optimizări asupra șirurilor de caractere și a dicționarelor.

Bytecode înghețat

Când MicroPython încarcă cod Python din sistemul de fișiere, mai întâi trebuie să analizeze fișierul într-o reprezentare temporară în memorie, iar apoi să genereze bytecode pentru execuție, ambele fiind stocate în heap (în RAM). Acest lucru poate duce la utilizarea unor cantități semnificative de memorie. Compilatorul încrucișat MicroPython poate fi folosit pentru a genera un fișier .mpy, care conține bytecode-ul precompilat pentru un modul Python. Acesta va fi în continuare încărcat în RAM, dar evită suprasolicitarea suplimentară a etapei de analizare.

Ca o optimizare suplimentară, bytecode-ul precompilat dintr-un fișier .mpy poate fi „înghețat” în imaginea firmware-ului ca parte a procesului principal de compilare a firmware-ului, ceea ce înseamnă că bytecode-ul va fi executat din ROM. Acest lucru poate duce la o economie semnificativă de memorie și la reducerea fragmentării heap-ului.

Vezi Fișierele manifest MicroPython pentru mai multe informații.

Variabile

MicroPython procesează diferit variabilele locale și globale. Variabilele globale sunt stocate și căutate într-un dicționar global care este alocat pe heap (rețineți că fiecare modul are propriul dicționar separat, deci propriul spațiu de nume). Variabilele locale, pe de altă parte, sunt stocate pe stiva de valori Python, care poate exista pe stiva C sau pe heap. Acestea sunt accesate direct prin offset-ul lor în cadrul stivei Python, ceea ce este mai eficient decât o căutare globală într-un dicționar.

Lungimea numelor variabilelor globale afectează de asemenea cantitatea de memorie RAM utilizată, deoarece identificatorii sunt stocați în RAM. Cu cât identificatorul este mai scurt, cu atât se folosește mai puțină memorie.

Celălalt aspect este că variabilele const care încep cu o liniuță de subliniere sunt tratate ca veritabile constante și nu sunt alocate sau adăugate într-un dicționar, economisind astfel ceva memorie. Aceste variabile folosesc const() din biblioteca MicroPython. Prin urmare:

from micropython import const

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

Se compilează în:

X = 1
foo(1, 2)

Alocarea memoriei

Majoritatea construcțiilor MicroPython obișnuite nu sunt alocate pe heap. Cu toate acestea, următoarele sunt:

  • structuri de date dinamice precum liste, mapări etc.;

  • funcții, clase și instanțe de obiecte;

  • importuri; și

  • prima atribuire a variabilelor globale (pentru a crea slotul în dicționarul global).

Pentru o discuție detaliată dintr-o perspectivă mai centrată pe utilizator asupra optimizării, vezi Maximizarea vitezei MicroPython.