Оптимізації¶
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.