Appelez Rust de Python pour accélérer! Tutoriel PyO3: Partie des classes d'habillage ➀

Aperçu

  1. Il n'est pas préférable en termes de vitesse d'écrire l'algorithme en Pyhton ~
  2. Très bien, recherchez quelque chose d'écrit autour de C, C ++ et appelez-le depuis Python pour l'accélérer.
  3. Je ne trouve pas de bonne bibliothèque,
  4. Oh, s'il a été écrit dans une langue appelée Rust
  5. Rust peut-il être appelé depuis Python? ??

C'est Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple ➁

Ce sera une continuation de.

Cible

Définissez une classe Rust (struct + méthode) et appelez-la depuis Python Le but est que.

Cette fois, je vais vous expliquer comment analyser une classe et comment appeler getter et setter via PyO3.

procédure

Utilisez le projet que vous avez créé la dernière fois avec cargo new --lib example. Bien sûr, il n'y a pas de problème même si vous en créez un nouveau.

Déclaration de classe

Écrivez ce qui suit dans lib.rs.


//lib.rs

use pyo3::prelude::*;
// ======================RUST CLASS TO PYTHON ======================================
/// Class for demonstration
// this class, MyClass can be called from python
#[pyclass(module = "my_class")]
struct MyClass {
   num: i32,
   debug: bool,
}

ici,


#[pyclass(module = "my_class")]

Vous permet d'appeler depuis Python via PyO3. J'ai écrit (module =" ma_classe ") comme un sort, mais je ne comprends pas vraiment ce que cela signifie. Je suis désolé.

Ici, MyClass est défini comme Struct et comme une propriété Il a num: i32 et debug: bool.

Tout d'abord, écrivez un constructeur pour pouvoir appeler cette classe en tant qu'objet Python.


#[pymethods]
impl MyClass{
    #[new]
    fn new(num:i32, debug:bool) -> Self{
        MyClass{
            num: num,
            debug: debug
        }
    }

Ici, en plus de ʻimpl`

#[pymethods]

Est déclaré (décoré?), Aussi au-dessus du fn new (num: i32, debug: bool) qui montre le constructeur

#[new]

Notez qu'il a été déclaré.

Ajout au module de classe

Ajoutez ceci au module comme dans la fonction précédente:


//lib.rs

use pyo3::{wrap_pyfunction};
// =================CREATING MODULE FOR PYTHON=========================
/// This module is a python module implemented in Rust.
#[pymodule]
fn test_library(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_wrapped(wrap_pyfunction!(get_prime_numbers))?;
    m.add_class::<MyClass>()?;

    Ok(())
}

ici,

m.add_class::<MyClass>()?;

Line ajoute MyClass au module.

Ajouter un getter et un setter

Cette fois, en plus de la déclaration de classe, j'écrirai le getter et le setter de propriété afin qu'ils puissent être appelés depuis Python.

//lib.rs

#[pymethods]
impl MyClass{
    #[new]
    fn new(num:i32, debug:bool) -> Self{
        MyClass{
            num: num,
            debug: debug
        }
    }

    #[getter]
    fn get_num(&self) -> PyResult<i32>{
        Ok(self.num)
    }

    #[setter]
    fn set_num(&mut self, num: i32) -> PyResult<()>{
        self.num = num;
        Ok(())
    }
}

De cette façon, vous pouvez également appeler des getters et des setters depuis Python via PyO3 en utilisant les décorateurs # [getter] et # [setter].

Cette fois, je n'ai écrit que sur la propriété num. Concernant la valeur de retour de getter, puisque le type de «num» est «i32», le côté Python le reçoit comme «PyResult ». Il n'y a pas de valeur de retour pour le setter, vous pouvez donc écrire PyResult <()>.

Les deux lors du passage d'un objet Python


Ok(self.num)

Ok(())

La remise de l'utilisation est la même que la dernière fois.

Compilez en utilisant setup.py

Les paramètres setup.py et Cargo.toml sont les mêmes que la dernière fois, mais juste au cas où

Cargo.toml


[package]
name = "test"
version = "0.1.0"
edition = "2018"

[lib]
name = "test_library"
crate-type = ["cdylib"]

[dependencies.pyo3]
version = "0.9.1"
features = ["extension-module"]

setup.py


from setuptools import setup
from setuptools_rust import Binding, RustExtension

setup(name='ope_rust',
        version='0.1',
        rust_extensions=[
            RustExtension('ope_rust', 'Cargo.toml',
                binding=Binding.PyO3)],
            zip_safe=False)

Ce sera.

python setup.py install

Vous pouvez compiler en faisant.

Essai

Lorsque vous exécutez le programme de test suivant,

test.py


import test_library 

if __name__  == "__main__":
    # Testing class
    print("\ntest for class")
    num = 2
    debug = True
    test = test_library.MyClass(num=num, debug=debug)

    print(test.num) # getter test
    test.num = 4    # setter test
    print(test.num)
$ python test.py

test for class
2
4

Il s'est avéré que la classe pouvait être construite et que les propriétés get et set pouvaient être exécutées.

Résumé

Le but, Définissez une classe Rust (struct + méthode) et appelez-la depuis Python C'était, Cette fois, j'ai expliqué comment appeler une classe écrite en Rust depuis Python.

Les constructeurs de classe et les getters et setters de propriétés peuvent également être appelés à partir de Python via PyO3.

La prochaine fois, j'aimerais ajouter quelques méthodes de la classe et expliquer diverses conversions de type.

Cette fois par ici.

fin.

Recommended Posts

Appelez Rust de Python pour accélérer! Tutoriel PyO3: Partie des classes d'habillage ➀
Appelez Rust de Python pour accélérer! Tutoriel PyO3: partie des classes d'emballage ➁
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple ➁
Aller au langage pour voir et se souvenir de la partie 8 Appeler le langage GO à partir de Python
Appelez Matlab depuis Python pour optimiser
Numba pour accélérer en Python
Comment accélérer les calculs Python
N'écrivez pas Python si vous voulez l'accélérer avec Python
[Python] Hit Keras depuis TensorFlow et TensorFlow depuis c ++ pour accélérer l'exécution.
Langage C pour voir et se souvenir de la partie 2 Appeler le langage C à partir de la chaîne Python (argument)
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
Langage C pour voir et se souvenir de la partie 4 Appelez le langage C depuis Python (argument) double
Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)
Langage C pour voir et se souvenir de la partie 3 Appelez le langage C depuis Python (argument) c = a + b
Étude de Python Hour7: Comment utiliser les classes
[Python] Faites de votre mieux pour accélérer SQL Alchemy
Un moyen simple d'appeler Java depuis Python
De la configuration du Raspberry Pi à l'installation de l'environnement Python
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Comment appeler Python ou Julia à partir de Ruby (implémentation expérimentale)