Rust を Python で使用する方法、および Python を Rust で使用する方法

Python と Rust は、言語スペクトルの対極にあるように見えます。 実行時に解釈される Python は、開発者に柔軟で快適なプログラミング環境を提供しますが、生の速度が犠牲になります。 Rust は速度に加えてメモリの安全性を保証しますが、メモリ操作を処理するための新しいパラダイムを学ぶ必要があります。

理論的には、これらの言語は競合しないはずです。 彼らは協力すべきです。 そして実際には、そうすることができます。 Rust は Python の使いやすさから利益を得ることができ、Python は Rust の速度と安全性から利益を得ることができます。

Rust を Python で使用する場合、または Python を Rust で使用する場合、最良の結果を得るには、少なくとも両方の言語に精通している必要があります。 また、それぞれのアプローチのオプションが大きく異なるため、2 つのうちどちらを主要言語にするかを決定する必要があります。

PyO3 を使用して Python から Rust を呼び出す

Python が主要な言語である場合、Rust との統合は、概念的には Python と C の統合と同じ方法で機能します。C で記述された Python のデフォルトの実装は、C で記述された拡張機能または C 互換の ABI を使用した拡張機能を使用します。 同じ ABI を使用する Rust で記述された拡張機能も機能しますが、自動ではありません。Rust 関数のバインディングを Python C API に提供するように設計されたクレートを使用する必要があります。

Python での Rust バインディングの作成

Python で Rust バインディングを作成するための最も広く認識されているプロジェクトは PyO3 です。 Rust で Python モジュールを記述したり、Python ランタイムを Rust バイナリに埋め込むために使用できます。

PyO3 は別のプロジェクトである Maturin を活用しています。これは、Python のパッケージ化とバインディングを使用して Rust クレートを作成するためのツールです。 Python 仮想環境にインストールすると、Maturin をコマンド ラインから使用して、Python バインディングを有効にした新しい Rust プロジェクトを初期化できます。 開発者は、Rust コードでディレクティブを使用して、どの Rust 関数を Python に公開するか、および Rust プロジェクト全体をインポート可能なモジュールとして Python に公開する方法を示します。

Rust と Python の型のマッピング

PyO3 の便利な側面の 1 つは、Rust と Python の型の間のマッピングです。 Rust で記述された関数は、ネイティブの Python 型または Python 型から変換された Rust 型のいずれかを受け入れることができます。 たとえば、 bytearraybytes Python のオブジェクトはエレガントにマップできます Vec Rust、および str Python では Rust としてレンダリングできます String.

Python から Rust に変換すると、呼び出しごとのコストが発生しますが、Rust コード全体で Python 型を使用する必要がなくなります。 Cython の世界では、これは C 型への変換に似ています。変換ごとにコストがかかりますが、目標が完全に C での数値処理である場合、大幅なスピードアップがもたらされます。

cpython クレートを使用して Rust から Python を呼び出す

あなたが主に Rust 開発者であるが、Rust アプリケーション内で Python を使用したい場合、cpython クレートはそれを行うための簡単な方法です。 お茶 cpython crate は、最も一般的な Python ランタイムである CPython インタープリターへの Rust バインディングを提供します (C で記述されているため、この名前が付けられています)。

Rust プログラムは CPython インタープリターを呼び出して操作できるため、Rust で Python オブジェクトを作成および操作し、ライブラリーを呼び出すことができます。 ドキュメントの 1 つの例では、Python ランタイムの初期化、モジュールのインポート、Python オブジェクトの作成、およびメソッド呼び出しの実行方法を示しています。

お茶 cpython crate には、いくつかの便利なマクロも含まれています。 お茶 py_fn! たとえば、マクロは Rust 関数をラップして、Python から呼び出せるようにします。 お茶 py_class! マクロを使用すると、Rust クラスを Python クラス オブジェクトとして生成できます。

Python よりも Rust に精通している場合は、飛び込む前に少なくとも Python C API とさまざまな Python オブジェクト型に精通しておくことをお勧めします。

パフォーマンスのヒント

両方の重要な警告 cpython PyO3 は、2 つの言語間でデータがやり取りされる回数を常に最小限に抑えます。 Python から Rust へ、またはその逆への呼び出しごとに、いくらかのオーバーヘッドが発生します。 オーバーヘッドが Rust で行っている作業を上回っている場合、パフォーマンスが大幅に向上することはありません。

例として、オブジェクト コレクションをループしている場合は、オブジェクトを Rust に送信し、そこでループを実行します。 これは、Python 側でループし、ループの各反復で Rust コードを呼び出すよりも効率的です。

このガイドラインは、通常、Python と Python C ABI を使用する他のコード (Cython モジュールなど) との統合にも適用されます。

著作権 © 2022 IDG Communications, Inc.

Leave a Comment

Your email address will not be published. Required fields are marked *