最佳化

MicroPython 使用數種最佳化來節省 RAM,同時也確保程式的高效執行。本章將討論其中一些最佳化。

備註

MicroPython 字串駐留(string interning)對映與字典 詳述了針對字串與字典的其他最佳化。

凍結位元組碼

當 MicroPython 從檔案系統載入 Python 程式碼時,它必須先將檔案剖析為暫時的記憶體內表示法,然後產生用於執行的位元組碼,這兩者都儲存在堆積中(位於 RAM)。這可能導致大量記憶體被使用。MicroPython 交叉編譯器可用於產生 .mpy 檔案,其中包含某個 Python 模組預先編譯好的位元組碼。這仍會被載入到 RAM 中,但它避免了剖析階段的額外開銷。

作為進一步的最佳化,.mpy 檔案中預先編譯的位元組碼可以在主韌體編譯過程中被「凍結」進韌體映像中,這表示位元組碼將從 ROM 執行。這可帶來顯著的記憶體節省,並減少堆積碎片化。

更多資訊請參閱 MicroPython manifest 檔案

變數

MicroPython 對區域變數與全域變數的處理方式不同。全域變數儲存於一個配置在堆積上的全域字典中,並由此查找(請注意每個模組都有各自獨立的字典,因此命名空間也是分開的)。另一方面,區域變數儲存於 Python 值堆疊上,該堆疊可能位於 C 堆疊或堆積上。它們是透過其在 Python 堆疊中的偏移量直接存取,這比在字典中進行全域查找更有效率。

全域變數名稱的長度也會影響 RAM 的使用量,因為識別字儲存於 RAM 中。識別字越短,使用的記憶體越少。

另一個面向是,以底線開頭的 const 變數會被視為真正的常數,不會被配置或加入字典中,因此可節省一些記憶體。這些變數使用 MicroPython 函式庫的 const()。因此:

from micropython import const

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

編譯為:

X = 1
foo(1, 2)

記憶體的配置

大多數常見的 MicroPython 結構不會配置在堆積上。然而,下列項目會:

  • 動態資料結構,例如串列、對映等;

  • 函式、類別與物件實例;

  • import;以及

  • 全域變數的首次指派(以在全域字典中建立該插槽)。

關於從更以使用者為中心的角度對最佳化進行的詳細討論,請參閱 最大化 MicroPython 速度