原文はこちら。
The original article was written by Olga Gupalo (Member of Tech Staff for GraalVM at Oracle), and co-author was Tim Felgentreff (the lead of GraalPy development at Oracle).
https://medium.com/graalvm/graalpy-quick-reference-0488b661a57c
GraalPyはGraalVM上に構築されたPython 3実装です。
A Python 3 implementation built on GraalVM
https://github.com/oracle/graalpython
活発に開発が続いていて、他のPythonの実装よりも大幅なパフォーマンスの向上を示しています。GraalPyは様々な用途で利用できます。例えば、
- 現在のJythonやCPythonランタイムの直接的な置き換えとして
- マネージドJavaアプリケーションでNumPy、SciPy、MatplotlibのようなPythonネイティブ拡張を実行する目的で
- ネイティブバイナリの作成目的で
などです。
Moving from Jython to GraalVM
https://medium.com/graalvm/moving-from-jython-to-graalvm-cf52c4af6106
https://logico-jp.io/2020/06/23/moving-from-jython-to-graalvm/
このエントリの目的は、開発者がGraalPyを使い始める手助けになることです。最も有用なGraalPyの情報を1ページにまとめました。以後では詳細を掘り下げます。

このクイックリファレンスカードはA4用紙にフィットするようにできていますので、ダウンロードして印刷できます。印刷には必ずPDF版を使用してください。もし、あなたがUSレター用紙を使うのであれば、必ずUSレター版を入手してください。
GraalPyには、あなたのニーズによって異なるバージョンがあり、2つのディストリビューションがあります。
- Oracle GraalPy
- GraalPy Community
Oracle GraalPyはGraalPy Communityよりもかなり高速で、開発および実運用で無料で利用できます(GraalVM Free Terms and Conditions (GFTC)ライセンスの下でライセンス許諾されています)。
GraalVM Free Terms and Conditions
https://oracle.com/downloads/licenses/graal-free-license.html
両者を区別するために、GraalPy Communityディストリビューションの名前には-communityという接尾辞がついています。
各ディストリビューションには2個のランタイムがあります。
- Native
- JVM
ネイティブ・ランタイムはCPythonと最も互換性があります。AOTコンパイル済みのPythonランチャーとして起動するので、高速に立ち上がり、メモリ使用量も少なくてすみます。
JVMランタイムはJavaと相互運用でき、その他のGraalVM言語を追加できます。名前についている接尾辞-jvmで識別できます。
Installing
LinuxまたはmacOSにGraalPyをインストールする場合、Pythonのバージョンマネージャであるpyenvをお勧めします。
Simple Python version management
https://github.com/pyenv/pyenv/
デフォルトでは、CPythonの単純置き換えとして完璧な、GFTCライセンスのネイティブバージョンがインストールされます。バージョン23.1.0をインストールするには、以下のコマンドを実行してください。
pyenv install graalpy-23.1.0
GraalPy Communityをインストールすることもできますが、この場合はPyenvで graalpy-community-23.1.0 を呼び出します。GraalPy CommunityはConda Forgeでも利用できます。
conda-forge | community driven packaging for conda
https://conda-forge.org
最新バージョンをインストールするには、以下のコマンドを使ってください。
conda create -c conda-forge -n graalpy graalpy
あるいは、GraalPyのリリースページにアクセスし、ご利用のOS用のGraalPyをダウンロードしてください。
Releases
https://github.com/oracle/graalpython/releases
ご注意いただきたいのは、Windowsでは(NumPyのような)ネイティブ拡張をインストールできませんが、pipを使って純粋なPythonパッケージをインストールすることはできます。アーカイブを展開し、必要であれば、環境変数がGraalPyを指すように設定します。binディレクトリの中には、graalpy、python、python3というランチャーがあります。これらは、標準のCPythonと同じコマンドラインオプションを受け付けます。
graalpy <options> <-c cmd | filename>
graalpy-ltランチャーはパフォーマンスとメモリフットプリントを犠牲にして、より良いデバッグと改善されたサンドボックスのために、GraalVM LLVMツールチェーンでネイティブ拡張をコンパイルします。Oracle GraalPyディストリビューションにはgraalpy-managedも含まれています。このランチャーはネイティブ拡張をコンパイルするために、graalpy-ltランチャーと同様にGraalVM LLVMツールチェーンを使用していますが、セキュリティ向上のために、libcに至るまでのすべてのネイティブライブラリがビットコードから実行されるマネージドモードで実行されます。これには、大幅なパフォーマンス・コストと互換性の低下が伴います。
Linux、macOS、Windowsで、GraalPyをソースからビルドも可能です。
A Python 3 implementation built on GraalVM
https://github.com/oracle/graalpython/tree/master#building-from-source
GraalPy Environment Setup
プロジェクトのセットアップは通常仮想環境の作成ならびにNumPyやPyTorchといった所望のパッケージをrequirements.txtを使ったり、直接だったりしてインストールするところから始まります。
graalpy -m venv my_project
source my_project/bin/activate
graalpy -m pip install numpy torch -r requirements.txt
パッケージがGraalPyと互換性があるかを確認するための初期ツールとして、Python Compatibility Checkerの利用をお勧めします。
GraalPy Package Compatibility
https://graalvm.org/python/compatibility/

ほとんどのネイティブ拡張パッケージは、GraalPy用のバイナリを公開していないため、インストール時に自動的にユーザーのマシンでコンパイルしようとすることに注意してください。すべてのライブラリと開発ツールがインストールされていることを確認してください。詳細については、様々なプロジェクトのドキュメントを参照するか、Slackで尋ねてください。
Slack
https://graalvm.slack.com/channels/graalpy
Development Setup
GraalPyの開発にはPyCharmを推奨します。
PyCharm
https://jetbrains.com/pycharm/
PyCharmでGraalPyを開発環境としてセットアップするには、以下の手順に従ってください。
| 作業 | 補足情報 | |
|---|---|---|
| 1 | GraalPyをインストール | |
| 2 | PyCharmをインストール | Install PyCharm https://www.jetbrains.com/help/pycharm/installation-guide.html |
| 3 | Pythonプロジェクトを作成もしくは開く | Create a Python project https://www.jetbrains.com/help/pycharm/creating-empty-project.html Open, reopen, and close projects https://www.jetbrains.com/help/pycharm/open-projects.html |
| 4 | Pythonプロジェクト用に新しいvenv仮想環境を作成 | Create a virtualenv environment https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html#python_create_virtual_env |
| 5 | PyCharmの指示に従ってパッケージをインストール | Install, uninstall, and upgrade packages https://www.jetbrains.com/help/pycharm/installing-uninstalling-and-upgrading-packages.html |
PyCharmの実行、デバッグ、プロファイリングツールはGraalPyでも動作します。もちろん、VS Codeのような他のコードエディタでGraalPyをセットアップすることもできます。Pythonインタプリタを選択し、GraalPyのpython実行ファイルを指定する方法については、エディタのマニュアルを参照してください。
Deployment
GraalPyアプリケーションは、他のPythonアプリケーションと同様にデプロイできます。さらに、GraalPyはメインスクリプトでPythonアプリケーションからスタンドアロンバイナリを作成するツールを提供します。以下のコマンドを実行するだけで、すべてのPython依存関係とGraalPy自身を含むmy_applicationバイナリが生成されます。これにより、追加の依存関係なしで配布できます。
graalpy -m standalone native \
--output my_application \
--module my_python_script.py
--venv <venv-dir>
この機能を使って、例えば以下のゲームのような、ゲームとそのアセット全体をデプロイすることも可能です。
Racing game utilizing a pseudo-3D rendering algorithm for race tracks. Parody of Persona 4
https://github.com/timfel/racing-all-afternoon
これはPythonにかけているユニバーサルデプロイメントオプションを補うものです。

Embed in Java
GraalPy Polyglot APIを使って、GraalPyをJavaアプリケーションへの埋め込みが可能です。
org.graalvm.polyglot (GraalVM SDK Java API Reference)
https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/package-summary.html
このように、GraalPyは動的スクリプト機能やモダンなデータサイエンスライブラリをJavaにもたらします。説明のために、GraalPyスタンドアロンツールを使って、Javaアプリケーションのサンプルを作成します。
graalpy -m standalone polyglot_app --output-directory MyPythonJavaEmbedding
このコマンドで、Pythonの依存関係を持つMavenプロジェクトのスケルトンを作成します。依存関係を使って、埋め込みアプリケーションの開発を進めることができます。生成されたpom.xmlを見て、Pythonパッケージを追加してください。そして、生成されたmain関数から、PythonをJavaからどのように利用するかを確認してください。その後、アプリケーションをパッケージングし、mvn exec:execで実行します。これはOpenJDKでも動作しますが、GraalVM JDKであればGraalPy上で動作するPythonコードに対してはるかに高いパフォーマンスを提供します。
既存のJavaアプリケーションにPythonを組み込むには、MavenやGradleのビルドツールの依存関係としてGraalPyを追加するか、明示的にモジュールパスにGraalPyのJARファイルを置いてください。少なくともMaven Centralのpython-languageとpython-resource JARファイルが必要です。
Maven configuration:
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>23.1.0</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>python</artifactId>
<version>23.1.0</version>
<type>pom</type>
</dependency>
Gradle configuration
dependencies {
implementation("org.graalvm.polyglot:polyglot:23.1.0")
implementation("org.graalvm.polyglot:js:23.1.0")
testImplementation("junit:junit:4.13.2")
}
GraalVM Polyglot API version 23.1の時点では、すべての必要なアーティファクトを直接Maven Centralからダウンロードできます。embedderに関連するすべてのアーティファクトはorg.graalvm.polyglotというMaven依存関係グループにあります。
org.graalvm.polyglot
https://central.sonatype.com/namespace/org.graalvm.polyglot
完全な設定例は、以下を参照してください。
Polyglot Embedding Demo with GraalVM for JDK 21
https://github.com/graalvm/polyglot-embedding-demo
Options Specific to GraalPy
他の Python 実装とは異なり、Chrome Inspector で Python コードをデバッグできます!これにより、PyCharm のような IDE を使っていなくても、シンプルなグラフィカルデバッガを利用できます。
graalpy --inspect your_script.py
GraalPyはPyCharmやpdbのようなPythonデバッガーとも一緒に使えます。
GraalPyはガベージコレクター(以下、GC)を使って、システムメモリの総量に基づいてメモリを確保します。デフォルトでは、利用可能であればGraalPyはCPythonよりもずっと多くのメモリを使います。これはGCを不必要に頻繁に実行することでパフォーマンスを向上させるためです。GCはJavaオプションを使って調整できます。例えば、--vm.Xmx1G と指定すれば、GraalPyが使う最大ヒープサイズを1GBに制限できます。NumPyやPyTorchといったネイティブコードがシステムから直接メモリをリクエストする場合、総メモリ利用量は増える可能性があります。
GraalPyは、JITコンパイラを使用しますが、JITコンパイラは複数のコアを用いコードをコンパイルする可能性があります。短時間実行のスクリプトの場合、JITコンパイラはスクリプトが終了するまでにJITコンパイルでコード最適化できない可能性があります。このような場合、--experimental-options --engine.Compilation=falseでJITコンパイルを無効にできます。このオプションの使用には注意が必要であり、その効果は具体的な作業負荷に大きく依存するため、実験的なものです。
Summary
このエントリでは、GraalPyに関する最も有用な開発者向けの情報を説明しました。この情報を1枚の紙にまとめてありますので、印刷してクイックリファレンスとして使っていただけます。Pythonアプリケーションを高性能でモダンなGraalPyで動かしてみてください!