Оптимізації

MicroPython використовує кілька оптимізацій для економії оперативної пам’яті та забезпечення ефективного виконання програм. У цьому розділі розглядаються деякі з цих оптимізацій.

Примітка

Інтернування рядків у MicroPython та Мапи та словники детально описують інші оптимізації рядків і словників.

Заморожений байт-код

Коли MicroPython завантажує код Python із файлової системи, він спочатку розбирає файл у тимчасове представлення в пам’яті, а потім генерує байт-код для виконання — обидва ці кроки вимагають місця в купі (у RAM). Це може призводити до значних витрат пам’яті. Крос-компілятор MicroPython можна використовувати для генерування файлу .mpy, що містить попередньо скомпільований байт-код модуля Python. Цей файл все одно завантажується в RAM, але дозволяє уникнути накладних витрат на стадію розбору.

Як додаткова оптимізація, попередньо скомпільований байт-код із файлу .mpy може бути «заморожений» в образі мікропрограми в рамках основного процесу компіляції мікропрограми — це означає, що байт-код виконуватиметься з ROM. Це може призвести до значної економії пам’яті та зменшення фрагментації купи.

Докладніші відомості дивіться в Файли маніфестів MicroPython.

Змінні

MicroPython по-різному обробляє локальні та глобальні змінні. Глобальні змінні зберігаються та шукаються у глобальному словнику, виділеному в купі (зверніть увагу, що кожен модуль має власний окремий словник, тобто власний простір імен). Локальні змінні, навпаки, зберігаються в стеку значень Python, який може знаходитися в стеку C або в купі. Доступ до них здійснюється безпосередньо за їх зміщенням у стеку Python, що є ефективнішим, ніж глобальний пошук у словнику.

Довжина імен глобальних змінних також впливає на обсяг використовуваної RAM, оскільки ідентифікатори зберігаються в пам’яті. Що коротший ідентифікатор, то менше пам’яті використовується.

Ще один аспект полягає в тому, що змінні const, ім’я яких починається з підкреслення, розглядаються як справжні константи та не виділяються і не додаються до словника, що дозволяє заощадити пам’ять. Ці змінні використовують const() із бібліотеки MicroPython. Тому:

from micropython import const

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

Компілюється в:

X = 1
foo(1, 2)

Виділення пам’яті

Більшість поширених конструкцій MicroPython не виділяються в купі. Однак наступні — виділяються:

  • Динамічні структури даних, такі як списки, відображення тощо;

  • функції, класи та екземпляри об’єктів;

  • імпорти; та

  • перше присвоєння значення глобальним змінним (для створення слота в глобальному словнику).

Детальний опис оптимізації з більш орієнтованої на користувача точки зору дивіться в Maximising MicroPython speed.