CircuitPython Turbo: ускорение кода на микроконтроллерах

Код на CircuitPython научили ускорять в десятки раз с помощью компиляции

Екатерина Иванова
Екатерина Иванова Стажер технический редактор
15 сентября 2026

CircuitPython отлично подходит для быстрого прототипирования на микроконтроллерах, но быстро упирается в производительность. Проект CircuitPython Turbo решает эту проблему с помощью предварительной компиляции в режимах Native и Viper.

Изображение записи

Вы, вероятно, не раз встречались в интернете с утверждением о том, что Python — это новый BASIC, который стал первым языком программирования для целого поколения разработчиков. Его главное преимущество заключается в том, что на нем легко и быстро писать код, однако, как тот же самый BASIC, это интерпретируемый язык, что сказывается на скорости выполнения программ.

Проект CircuitPython, созданный компанией Adafruit на основе MicroPython, предназначен для быстрого прототипирования на микроконтроллерах. Плата определяется как обычная флешка, а написанный код сразу выполняется прямо на устройстве без сборки прошивки и настройки сложных toolchain.

Подобный подход действительно может быть полезен для начинающих программистов и небольших проектов, но быстрее, чем хотелось бы, упирается в потолок производительности железа. CircuitPython Turbo от Майка Склара, созданный при участии Claude LLM, нацелен помочь с решением этой проблемы: теперь важные участки кода можно предварительно компилировать.

Как происходит ускорение

Если вам показалось, что чем-то это все напоминает Viper, то вам не показалось. Как мы уже вспомнили ранее, CircuitPython — это форк MicroPython с некоторыми полезными дополнениями для плат Adafruit, но до сих пор Viper не входил в их число. До появления версии Turbo CircuitPython работал только в интерпретируемом режиме.

Как и в MicroPython, важные участки кода можно перевести в нативный режим: инструкции скомпилируются напрямую, а переменные останутся объектами Python, что даст прирост скорости примерно в три раза. Если же слегка доработать код — явно объявить типы и работу с памятью, — включается режим Viper, увеличивающий производительность уже в 20–70 раз.

В официальной документации приводятся результаты тестирования на алгоритме множества Мандельброта. На плате Metro RP2040 выполнение кода в режиме Native ускорилось в 3 раза, а в режиме Viper — в 19,7 раза по сравнению со стандартным байт-кодом.

Архитектурные особенности и структура проекта

Технически решение состоит из специальной прошивки и консольной утилиты. Прошивка собирается с параметром CIRCUITPY_LOAD_NATIVE=1, добавляющим загрузчик размером 2–3 КБ без набортного компилятора. Скомпилированные бинарные .mpy файлы создаются на компьютере с помощью компилятора mpy-cross и загружаются на плату.

При загрузке устройства скрипт lib/turbo.py объемом 49 строк модифицирует системный список sys.path, помещая путь к скомпилированным модулям /lib/turbo/<arch>/ в его начало. Исходные .py файлы переносятся в каталог /src/, который намеренно исключен из стандартного sys.path, чтобы исходный код не перекрывал бинарные модули при импорте. Главный файл code.py всегда исполняется как исходный код, так как запускается через pyexec_file.

Результаты тестов и дальнейшее развитие

Проект протестирован на двенадцати отладочных платах с архитектурами ARM Thumb, Xtensa и RISC-V. Наибольший прирост скорости в режиме Viper продемонстрировала плата Metro M0 Express, ускорившаяся в 71,7 раза. Плата ESP32-C5 на архитектуре RISC-V показала 44-кратное ускорение.

Единственное, чего тут не хватает по сравнению со старым добрым BASIC — это встроенный ассемблер. К слову, в оригинальном MicroPython он есть, так что не исключено, что появится и в Turbo. Разумеется, Python подходит далеко не для каждого микроконтроллерного проекта, но на нем уже умудряются делать всё подряд — от систем управления электровелосипедами до железных плееров в стиле Winamp.