検索
ニュース

Wasmerが「py2wasm」を発表、PythonからWebAssemblyに変換 インタープリタより3倍高速実行可能にNuitkaを利用し高速化、難読化

WebAssembly(Wasm)ランタイムを開発するWasmerは、PythonプログラムをWebAssemblyに変換し、ベースラインインタープリタよりも3倍高速に実行できるようにする「py2wasm」を発表した。

Share
Tweet
LINE
Hatena

 WebAssembly(Wasm)ランタイムを開発するWasmerは2024年4月19日(米国時間)、PythonプログラムをWebAssemblyに変換し、ベースラインインタープリタよりも3倍高速に実行できるようにするコンパイラ「py2wasm」を発表した。

 py2wasmの使い方は以下の通り。

 なお、py2wasmはPython 3.11環境で実行する必要がある。

pystone.pyベンチマーク

 Wasmerは、「pystone.py」ベンチマークを使用して、「Pythonをネイティブに実行した場合」「CPythonインタープリタをWebAssemblyで実行した場合」「Pythonコンパイラ『Nuitka』のフォークを用いたpy2wasmを使用した場合」のパフォーマンスを比較した結果を、以下のように報告している。


Pythonのパフォーマンス比較(提供:Wasmer)

Pythonをネイティブに実行した場合

CPythonインタープリタをWebAssemblyで実行した場合

Pythonコンパイラ「Nuitka」のフォークを用いたpy2wasmを使用した場合

 py2wasmを使用すると、ネイティブPythonの約70%の速度を達成でき、ベースラインインタープリタよりも2.5〜3倍高速に実行できる。

WebAssemblyでPythonワークロードを最適化する方法

 Wasmerは、WebAssemblyでPythonを高速化する方法として、以下の3つを比較検討した。その結果、PythonコンパイラであるNuitkaのフォークをpy2wasmに採用することを決めた。

パフォーマンスの高いコードにコンパイル可能なPythonのサブセットのみをWebAssemblyにコンパイルする

 この方法では、Cython、RPython(PyPy)、Codonがよく使用される。

  • 利点:高パフォーマンスのコードを生成できる
  • 欠点:完全な構文やモジュールをサポートしない

Python内部でJITを使用し、実行のホットパスがWebAssemblyにコンパイルされるようにする

 この方法では、PyPyがよく使用される。

  • 利点:極めて高速
  • 欠点:ウォームアップが必要
  • 欠点:WebAssemblyでサポートするのは容易なことではない(サポートは可能)

生成されたコードを静的解析を用いて最適化する

 この方法では、Mypy、mypy-cがよく使用される。

  • 利点:どのPythonコードやアプリケーションともほぼ互換性がある
  • 欠点:1.5〜3倍の高速化しか期待できない
  • 欠点:適切に実行するのが難しい
  • 欠点:バイナリが大きくなる

Nuitkaの採用

 Nuitkaは、プログラムが行うPythonの呼び出しをCにトランスパイルすることで動作する。Pythonコードを対応するCPython呼び出しにトランスパイルするので、ほとんどのPythonプログラムをサポートする。

 また、コードの難読化も可能にする(生成されたプログラムは逆コンパイルできない)。

 全ての選択肢を分析した結果、WebAssemblyでPythonを最速で動作させる方法は、Nuitkaを使用することだろうと、Wasmerは判断した。

 Wasmerは、同社のサーバレスアプリケーションプラットフォーム「Wasmer Edge」で、Pythonバックエンドアプリケーションを極めて高いパフォーマンスで実行できるようにすることで、こうしたアプリケーションのホスティングの選択肢を、現在のクラウドプロバイダーよりはるかに安価に提供することを目指しており、py2wasmによって、この目標に一歩近づけると述べている。

 また、Wasmerは将来的に、py2wasmをWasmerパッケージとして公開し、以下のコマンドを実行するだけで動作するようにする計画だ。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る