最適化

MicroPython は、RAM を節約するだけでなくプログラムの効率的な実行を保証するために、いくつかの最適化を使用しています。この章では、これらの最適化のいくつかについて説明します。

注釈

MicroPython の文字列インターニングマップと辞書 では、文字列と辞書に関するその他の最適化について詳しく説明しています。

フリーズされたバイトコード

MicroPython がファイルシステムから Python コードを読み込む際には、まずファイルを一時的なメモリ内表現に解析し、次に実行のためのバイトコードを生成する必要があり、これらはいずれもヒープ(RAM 内)に格納されます。これにより、かなりの量のメモリが使用されることがあります。MicroPython のクロスコンパイラを使用すると、Python モジュールの事前コンパイル済みバイトコードを含む .mpy ファイルを生成できます。これも依然として RAM に読み込まれますが、解析段階の追加オーバーヘッドを回避できます。

さらなる最適化として、.mpy ファイルの事前コンパイル済みバイトコードは、メインのファームウェアコンパイルプロセスの一環としてファームウェアイメージに「フリーズ」でき、これによりバイトコードは ROM から実行されます。これにより大幅なメモリ節約が可能になり、ヒープの断片化を軽減できます。

詳細については MicroPython マニフェストファイル を参照してください。

変数

MicroPython はローカル変数とグローバル変数を異なる方法で処理します。グローバル変数は、ヒープ上に割り当てられたグローバル辞書に格納され、そこから参照されます(各モジュールは独自の個別の辞書を持つため、名前空間も個別である点に注意してください)。一方、ローカル変数は Python の値スタックに格納され、これは C スタック上またはヒープ上に存在する場合があります。ローカル変数は Python スタック内のオフセットによって直接アクセスされ、これは辞書内でのグローバル参照よりも効率的です。

識別子は RAM に格納されるため、グローバル変数名の長さも使用される RAM の量に影響します。識別子が短いほど、使用されるメモリは少なくなります。

もう 1 つの側面として、アンダースコアで始まる const 変数は本来の定数として扱われ、辞書に割り当てられたり追加されたりしないため、メモリをいくらか節約できます。これらの変数は MicroPython ライブラリの const() を使用します。したがって、次のコードは:

from micropython import const

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

次のようにコンパイルされます:

X = 1
foo(1, 2)

メモリの割り当て

一般的な MicroPython の構文のほとんどはヒープ上に割り当てられません。ただし、次のものは割り当てられます。

  • リストやマッピングなどの動的データ構造

  • 関数、クラス、オブジェクトインスタンス

  • インポート

  • グローバル変数への初回の代入(グローバル辞書内にスロットを作成するため)。

最適化をよりユーザー中心の視点から詳しく解説したものについては、MicroPython の速度を最大化する を参照してください。