Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen von Klassen Teil ➀

Überblick

  1. In Bezug auf die Geschwindigkeit ist es nicht vorzuziehen, den Algorithmus in Pyhton ~ zu schreiben
  2. Okay, suchen Sie nach etwas, das in C, C ++ geschrieben ist, und rufen Sie es von Python aus auf, um es zu beschleunigen.
  3. Ich kann keine gute Bibliothek finden,
  4. Oh, wenn es in einer Sprache namens Rust geschrieben wurde
  5. Kann Rust von Python aus aufgerufen werden? ??

Dies ist Rust von Python anrufen, um zu beschleunigen! PyO3-Tutorial: Einpacken eines einfachen Funktionsteils ➁

Es wird eine Fortsetzung von sein.

Ziel

Definieren Sie eine Rust-Klasse (struct + method) und rufen Sie sie von Python aus auf Das Ziel ist das.

Dieses Mal werde ich erklären, wie man eine Klasse analysiert und wie man Getter und Setter über PyO3 aufruft.

Verfahren

Verwenden Sie das Projekt, das Sie zuletzt mit "load new --lib example" erstellt haben. Natürlich gibt es kein Problem, auch wenn Sie ein neues erstellen.

Klassenerklärung

Schreiben Sie Folgendes in 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,
}

Hier,


#[pyclass(module = "my_class")]

Ermöglicht das Aufrufen von Python über PyO3. Ich habe "(module =" my_class ")" als Zauber geschrieben, aber ich verstehe nicht wirklich, was es bedeutet. Es tut mir Leid.

Hier wird MyClass als Struct und als Eigenschaft definiert Es hat num: i32 und debug: bool.

Schreiben Sie zunächst einen Konstruktor, damit Sie diese Klasse als Python-Objekt aufrufen können.


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

Hier oben auf "impl"

#[pymethods]

Wird deklariert (dekoriert?), Auch über dem fn new (num: i32, debug: bool ), das den Konstruktor zeigt

#[new]

Beachten Sie, dass es deklariert wurde.

Ergänzung zum Klassenmodul

Fügen Sie dies dem Modul wie in der vorherigen Funktion hinzu:


//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(())
}

Hier,

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

Line fügt dem Modul MyClass hinzu.

Getter und Setter hinzufügen

Dieses Mal werde ich zusätzlich zur Klassendeklaration den Property Getter und Setter schreiben, damit sie von Python aus aufgerufen werden können.

//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(())
    }
}

Auf diese Weise können Sie auch Getter und Setter von Python über PyO3 aufrufen, indem Sie die Dekoratoren # [getter] und # [setter] verwenden.

Diesmal habe ich nur über die Eigenschaft num geschrieben. In Bezug auf den Rückgabewert von Getter empfängt die Python-Seite ihn als "PyResult ", da der Typ von "num" "i32" ist. Es gibt keinen Rückgabewert für den Setter, daher können Sie "PyResult <()>" schreiben.

Beides beim Übergeben eines Python-Objekts


Ok(self.num)

Ok(())

Die Übergabe erfolgt wie beim letzten Mal.

Kompilieren Sie mit setup.py

Die setup.py und Cargo.toml sind die gleichen wie beim letzten Mal, aber nur für den Fall

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)

Es wird sein.

python setup.py install

Sie können kompilieren, indem Sie.

Testlauf

Wenn Sie das folgende Testprogramm ausführen,

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

Es stellte sich heraus, dass die Klasse konstruiert und die Eigenschaften get und set ausgeführt werden konnten.

Zusammenfassung

Das Ziel, Definieren Sie eine Rust-Klasse (struct + method) und rufen Sie sie von Python aus auf Es war, Dieses Mal erklärte ich, wie man eine in Rust geschriebene Klasse aus Python aufruft.

Klassenkonstruktoren und Getter und Setter von Eigenschaften können auch von Python über PyO3 aufgerufen werden.

Beim nächsten Mal möchte ich einige Methoden der Klasse hinzufügen und verschiedene Typkonvertierungen erläutern.

Diesmal hier.

Ende.

Recommended Posts

Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen von Klassen Teil ➀
Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen von Klassen Teil ➁
Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen einer einfachen Funktion Teil ➀
Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen einer einfachen Funktion Teil ➁
Gehen Sie zur Sprache, um Teil 8 zu sehen und sich daran zu erinnern. Rufen Sie die GO-Sprache von Python aus auf
Rufen Sie Matlab von Python zur Optimierung auf
Numba als Python zu beschleunigen
So beschleunigen Sie Python-Berechnungen
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
[Python] Drücken Sie Keras von TensorFlow und TensorFlow von c ++, um die Ausführung zu beschleunigen.
C-Sprache zum Anzeigen und Erinnern Teil 2 Rufen Sie die C-Sprache aus der Python-Zeichenfolge (Argument) auf
C-Sprache zum Sehen und Erinnern Teil 1 Rufen Sie die C-Sprache aus Python auf (Hallo Welt)
C-Sprache zum Anzeigen und Erinnern Teil 4 Rufen Sie die C-Sprache von Python (Argument) double auf
C-Sprache zum Anzeigen und Erinnern Teil 5 Rufen Sie die C-Sprache aus dem Python-Array (Argument) auf
C-Sprache zum Sehen und Erinnern Teil 3 Rufen Sie die C-Sprache aus Python auf (Argument) c = a + b
Studie aus Python Hour7: Verwendung von Klassen
[Python] Geben Sie Ihr Bestes, um SQL Alchemy zu beschleunigen
Eine einfache Möglichkeit, Java von Python aus aufzurufen
Vom Einrichten des Raspberry Pi bis zur Installation der Python-Umgebung
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Wie man Python oder Julia von Ruby aus aufruft (experimentelle Implementierung)