このエントリは2024/03/28現在の情報に基づいています。将来の機能追加や変更により、記載内容からの乖離が発生する可能性があります。
Pythonはほぼ初心者ではあるが、GraalVM大好きな身としては、Graal Python (GraalPy) を使ってみたかったので試してみた。実際に「ただ試してみた」という、どこかのあれみたいな内容である。
GraalPyって何?
GraalPy (Graal Python) は、CPythonの置き換えが可能なPython実装で、現在3.10系の実装が提供されている。最新版は2024/03/28現在24.0.0。
GraalPy
https://www.graalvm.org/python
https://github.com/oracle/graalpython
依存関係
REST APIを作るとなると、FastAPIを使うことが多いと思われるが、現時点では、FastAPIではなく、Flaskが利用できる(2024/03/28現在、FastAPIの依存関係がGraalPyに対応できていないためにFastAPIは使えない。ただIssueを見ている限り、近日中に解決しそうな感じ)。
コード
お作法自体は通常のCPythonと何ら違いはない。まず仮想環境を作って入り、必要な依存関係をpipで取り込む。
$ graalpy -m venv venv
$ . venv/bin/activate
$ pip install ...
例えば、Query Parameterでnameを渡すとHello {name}が返ってくる、という非常にシンプルなREST APIを作ることにする。
from flask import Flask, request, jsonify
# create a Flask instance
app = Flask(__name__)
@app.route('/api/greeting', methods=['GET'])
def greeting():
name = request.args['name']
return jsonify({"message" : "Hello, " + name})
if __name__ == "__main__":
app.run(host='0.0.0.0')
もちろん、インタープリターで動作させることもできる。
$ graalpy main.py
Postmanから試してみると…

Native Imageに仕立てる
GraalPyなので、もちろんNative Imageに仕立てることができる。以下のドキュメントに従って、Native Imageに変換する。
Python Standalone Applications
https://www.graalvm.org/latest/reference-manual/python/standalone-applications/
graalpy -m standalone native \
--module main.py \
--output main.bin \
--venv venv
問題なくNative Imageを生成できた・・・のだが、生成されたNative Imageのサイズが、386,688,944 Byte (およそ369 MByte) 、ビルドに要した時間はおよそ10分。今後Quick Buildモード (-Ob) で時間短縮するとか、パフォーマンス向上のためにPGO使う (--pgo) とか、--march=nativeを指定してみるとか、Serial GCではなくG1 GCを使う (--gc=G1) とか、色々比較しながら実験できそうではあるが、今日は一旦ここまで。