よくある質問

モジュール/パッケージXYZはGraalVMのPythonランタイムで動作しますか。

状況によりますが、現時点ではその可能性はほとんどありません。GraalVMのPythonランタイムの最初の目標は、管理対象GraalVM LLVMランタイムを使用してNumPyおよび関連パッケージを実行できることを示すことでした。GraalVMチームは引き続きCPythonユニットテストの合格数を増やすとともに、一般的なPyPIパッケージとの互換性を追跡しています。

GraalVM PythonランタイムでJythonユースケースを置き換えることは可能ですか。

可能ですが、Javaクラスをサブクラス化するPythonコードやjavax.script.ScriptEngineを介した使用がサポートされていないなど、いくつかの注意事項があります。詳細は、「Jython移行ガイド」を参照してください。

GraalVMのPythonランタイムで使用するために、ネイティブ・モジュールをLLVMビットコードとしてコンパイルして実行する必要がありますか。

GraalVMでは、Python C拡張モジュールは、GraalVM LLVMランタイムを使用して実行されます。このようなモジュールを使用するために、バイナリ・ディストリビューションを使用することはできず、かわりにGraalVM Pythonランタイムを使用してソースからそれらをインストールする必要があり、これにより、ビルド・プロセス中にLLVMビットコードが透過的に生成されます。ただし、Pythonのコア機能の多く(os APIの大部分などを含む)はPure Javaで実装されており、多くの標準ライブラリ・モジュールおよびパッケージはLLVMビットコードを実行せずに動作します。そのため、PythonランタイムがGraalVM LLVMランタイムに依存していても、多くのユースケースについては、ネイティブ・モジュール全体を禁止できます。

PythonでGraalVMサンドボックス機能を使用できますか。

はい、できます。埋込み担当者は、機能を個別に選択して無効にできます。たとえば、ネイティブ・コードの実行やファイルシステム・アクセスを無効にできます。また、LLVM用のGraalVMの管理対象実行モードも、NumPyなどの拡張機能をより安全に実行するために十分に機能します。

GraalVMのポリグロット機能はすべてPythonで動作しますか。

チームは、GraalVMのすべてのポリグロット機能が確実にPythonユーザーの期待どおりに動作することを目指して継続的な取組みを進めています。それでも、期待が明確でなかったり、複数の動作が考えられるケースが多々あります。チームはユースケースを積極的に検討して、最も便利で、かつ最も驚きが少ない動作を提供するようにGraalVM Pythonランタイムを継続的に進化させています。

GraalVMのPythonランタイムにはどのようなパフォーマンスを期待できますか。

Pure Pythonコードについては、ウォームアップ後のパフォーマンスは、CPython 3.8よりも約5-6倍高速(またはJythonよりも6-7倍高速)になると期待できます。LLVMビットコードとして実行されるネイティブ拡張機能については、現時点ではCPythonは低速であり、期待できるパフォーマンスは0.1倍から0.5倍です。

JITコンパイラを使用する言語では起動に時間がかかると聞きました。このことはGraalVMのPythonランタイムにも当てはまりますか。

状況によります。Pythonでネイティブ・イメージを使用する場合、またはGraalVMのgraalpythonランチャを使用する場合、起動はCPythonと同等です。ネイティブ・イメージを使用するにしても、JVMで実行するにしても、いずれの場合も、ピーク・パフォーマンスに達するには最初にウォームアップする必要があります。これ自体は複雑な話ですが、一般に、コア・ワークロードに到達して実行した後、しばらく(1、2分)かかることがあります。

複数のPythonコンテキスト間でウォームアップ・コードを共有できますか。

はい、これは正常に機能します。同じエンジンで複数のコンテキストを起動し、それらで同じコードまたは類似するコードを実行すると、コンパイルされたコードが複数のコンテキスト間で共有されるため、ますます高速になることがわかります。ただし、現時点では、この設定のピーク・パフォーマンスは単一コンテキストの場合よりも低くなります。