最適化¶
MicroPython は RAM を節約しつつ、プログラムの効率的な実行を保証するためにいくつかの最適化を使っています。この章では、これらの最適化のいくつかを説明します。
注釈
MicroPython 文字列の隔離化 と マップと辞書 では、文字列と辞書に関する最適化について別に詳しく説明します。
凍結バイトコード¶
MicroPython がファイルシステムから Python コードをロードするとき、まずファイルを一時的なメモリ内表現にパースし、次に実行のためのバイトコードを生成する必要があります。これらは両方ともヒープ(RAM)に格納されています。このため、大量のメモリが使用される可能性があります。MicroPythonクロスコンパイラを使用すると、Python モジュールのコンパイル済みバイトコードを含む .mpy
ファイルを生成することができます。この場合もRAMにロードされますが、解析ステージの追加オーバーヘッドを回避できます。
さらなる最適化として、 .mpy
ファイルからコンパイル済みのバイトコードを、ファームウェア のメインコンパイルプロセスの一部として、ファームウェアイメージに「凍結」できます。これは、バイトコードがROMから実行されることを意味します。これは、大幅なメモリ節約につながり、ヒープの断片化を軽減できます。
詳しくは MicroPython マニフェストファイル を参照してください。
変数¶
MicroPython はローカル変数とグローバル変数を異なる方法で処理します。グローバル変数は、ヒープ上に割り当てられたグローバル辞書に格納され、検索されます(各モジュールは、それ自身の独立した辞書を持っているので、別の名前空間であることに注意してください)。一方、ローカル変数は Python の値スタックに格納され、Cスタックやヒープ上に存在することもあります。ローカル変数は、Pythonスタック内のオフセットによって直接アクセスされ、dict でグローバルに検索するよりも効率的です。
グローバル変数名の長さは、識別子が RAM に保存されるため、RAM の使用量に影響します。識別子が短ければ短いほど、メモリ消費量は少なくなります。
もうひとつは、アンダースコアで始まる const
変数は適切な定数として扱われ、辞書に割り当てられたり追加されたりしないので、メモリを節約できるという点です。これらの変数は、MicroPythonライブラリの const()
を使います。つまり:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
は、次のように解釈されます:
X = 1
foo(1, 2)
メモリの割当て¶
MicroPython の一般的な構成要素のほとんどは、ヒープに割り当てられません。しかし、以下のものは割り当てられます:
リスト、マッピングなどの動的なデータ構造
関数、クラス、オブジェクトインスタンス
インポートしたもの
グローバル変数の初回割り当て(グローバル辞書にスロットを作成するため)。
最適化に関するユーザー視点でのより詳細な議論については、MicroPython 性能の最大化 を参照してください。