- Python プログラムを WebAssembly に変換するコンパイラ
- インタープリタのオーバーヘッドをなくし、CPython(WASM)より 3 倍高速に動作
- CPython(Native)と比べると速度は約 60%
- Python を WebAssembly 上で高速に実行する方法はいくつかある
- 高性能なコードにコンパイルできる Python のサブセットを使う: CPython、RPython(PyPy)、Codon
- Python 内部で JIT を使う: PyPy
- 静的解析を使って生成コードを最適化する: mypy & mypy-c、Nuitka
- ここでは最終的に Python 最適化コンパイラである Nuitka を利用することにした
Nuitka
- Nuitka は、プログラムが実行する Python 呼び出しを内部の CPython API 呼び出しを使って C に変換することで動作する
- ほとんどの Python プログラムをサポートし、Python コードを対応する CPython 呼び出しへ変換する
- コード難読化ツールとしても機能する(誰もプログラムを逆コンパイルできない!)
- あらゆる選択肢を詳しく分析した結果、WebAssembly 上で Python を実行する最速の方法はおそらく Nuitka を使うことだと分かった
Nuitka を使って Python を WebAssembly にコンパイル
- Nuitka は、Python コードを基盤となる CPython インタープリタ呼び出しへ変換する作業の大半がすでに済んでいるため、WebAssembly コンテキストで Python を高速化する最も簡単な選択肢のように思われた
- Nuitka はまだ Python 3.12 では動作しないため、Python を 3.11 で WASI 向けに再コンパイルし、生成された
libpython.a アーカイブを使う必要があった
- 生成された Wasm ファイルを実行しようとすると別の問題もあったため、変更を Nuitka にアップストリームするための PR を提出した
- 現在の py2wasm は Nuitka のフォークを使用しているが、変更がアップストリームに統合されれば、py2wasm を Nuitka の上に載る薄いレイヤーにする計画
- Python 実行を可能な限り高速化し、Python Django バックエンドを Google Cloud から Wasmer Edge に移行することが当初の要件だった
- py2wasm は、Python バックエンドアプリを Edge 上で驚異的な性能で動かすことに一歩近づけ、現在のクラウドプロバイダーよりもはるかに安価なホスティングの選択肢を提供する助けになる
今後のロードマップ
まだコメントはありません。