优化¶
MicroPython 使用多项优化来节省 RAM,同时确保程序的高效执行。本章讨论了其中的一些优化。
笔记
MicroPython 字符串实习 和 Maps and Dictionaries 详细介绍了对字符串和字典的其他优化。
冻结字节码¶
当 MicroPython 从文件系统加载 Python 代码时,它首先必须将文件解析为内存中的临时表示,然后生成要执行的字节码,两者都存储在堆中(在 RAM 中)。这可能会导致使用大量内存。MicroPython 交叉编译器可用于生成.mpy
文件,其中包含 Python 模块的预编译字节码。这仍将加载到 RAM 中,但它避免了解析阶段的额外开销。
作为进一步的优化,来自.mpy
文件的预编译字节码可以作为主要固件编译过程的一部分“冻结”到固件映像中,这意味着字节码将从 ROM 执行。这可以显着节省内存,并减少堆碎片。
变量¶
MicroPython 以不同的方式处理局部变量和全局变量。全局变量存储并从分配在堆上的全局字典中查找(请注意,每个模块都有自己单独的字典,因此是单独的命名空间)。另一方面,局部变量存储在 Python 值堆栈中,该堆栈可能位于 C 堆栈或堆中。它们通过它们在 Python 堆栈中的偏移量直接访问,这比在 dict 中进行全局查找更有效。
全局变量名称的长度也会影响使用多少 RAM 作为标识符存储在 RAM 中。标识符越短,使用的内存就越少。
另一方面是以const
下划线开头的变量被视为适当的常量并且不会分配或添加到字典中,因此节省了一些内存。这些变量const()
来自 MicroPython 库。所以:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
编译为:
X = 1
foo(1, 2)
内存分配¶
大多数常见的 MicroPython 构造都没有在堆上分配。然而,以下是:
动态数据结构,如列表、映射等;
函数、类和对象实例;
进口;和
全局变量的第一次分配(在全局字典中创建槽)。
有关更以用户为中心的优化视角的详细讨论,请参阅最大化 MicroPython 速度