Also habe ich ein "Cython" -Tutorial zum Aufrufen von C ++ - Bibliotheken aus Python geschrieben, um die Dinge zu beschleunigen.
Ab diesem Zeitpunkt werde ich ein Tutorial einer Bibliothek namens "PyO3" schreiben, um Rust aus Python aufzurufen und zu beschleunigen.
Das ultimative Ziel ist
In der Lage sein, Funktionen und Klassen (wie Dinge?) Einfach aufzurufen. Geschrieben in Rost von Python
ist.
Dieses PyO3 (git is here) befindet sich mitten in der Entwicklung und wird (wahrscheinlich) mit einer enormen Geschwindigkeit aktualisiert.
Ausgehend von Rusts erstem Blick: Ich habe PyO3 mit dem Ziel berührt, in Rust geschriebene Funktionen von Python aus aufrufen zu können.
Es gibt einige Kommentarartikel zu Kita und anderen Blogs.
Diesmal, Rust-Modul von Python (PyO3) ausführen Ich möchte Ihren Code ausleihen, setup.py hinzufügen und eine in Rust von Python geschriebene Funktion aufrufen.
Rost einbauen
Wenn Sie die erste Zeile ausführen, werden Sie nach der Installation mit drei Auswahlmöglichkeiten gefragt, aber ich denke, dass es kein Problem gibt, eine der Standardinstallationen auszuwählen.
curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
Installieren Sie jeden Abend Rost
Sie benötigen es, um PyO3 zu verwenden. Ist es so etwas wie eine Beta-Version, die viele Kisten enthält, die sich in der Entwicklung befinden?
Überprüfen Sie die Version Ich werde diese Version dieses Mal verwenden.
$rustc --version
rustc 1.44.0-nightly (f509b26a7 2020-03-18)
$ rustup --version
rustup 1.21.1 (7832b2ebe 2019-12-20)
rustup install nightly
rustup default nightly
Erstellen Sie ein Rostprojekt
Erstellen Sie ein Projekt für die Bibliothek, indem Sie "--lib" hinzufügen. Diesmal lautet der Projektname "Beispiel".
cargo new --lib example
$ tree example/
├── Cargo.toml
├── setup.py
├── src
│ └── lib.rs
Die Ordnerstruktur sieht so aus.
Eines der Dinge, von denen Rust sagt, dass sie besser sind als C ++ usw., ist die einfache Verwaltung der Bibliothek.
Ich schreibe die notwendigen Bibliotheken in Cargo.toml
, aber es ist viel einfacher und leichter zu lesen als CMakeLists.txt
.
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"]
Diesmal habe ich pyo3 als Bibliothek verwendet Die zu erstellende Zielbibliothek ist "test_library".
Das heißt, in Python
test.py
import test_library
Ich möchte so schreiben.
Versuchen Sie vorerst zu kopieren
Der Code lautet [Rust-Modul von Python (PyO3) ausführen]](https://ohke.hateblo.jp/entry/2020/02/15/230000) Ich habe alle seine Sachen mitgebracht. Es scheint eine Umsetzung der Siebung von Eratostenes zu sein.
//lib.rs
use pyo3::prelude::*;
// This is the test function in Rust, getting prime number, which is called by python as get_prime_numbers
#[pyfunction]
fn get_prime_numbers(n: i32) -> PyResult<Vec<i32>> {
let mut flags = Vec::new();
for _ in 0..n+1 {
flags.push(true);
}
let upper = (n as f32).sqrt().floor() as i32;
for i in 2..upper+1 {
if !flags[i as usize] {
continue;
}
let prime = i;
let mut j = prime * 2;
while j <= n {
flags[j as usize] = false;
j += prime;
}
}
let mut primes = Vec::new();
for i in 2..n+1 {
if flags[i as usize] {
primes.push(i);
}
}
Ok(primes)
}
Ich bin nicht in der Lage, Rusts Syntax im Detail zu erklären Nehmen wir an, dass diese Funktion korrekt ist, und erklären Sie, wie sie in ein Formular eingeschlossen wird, das von Python aus aufgerufen werden kann.
#[pyfunction]
fn get_prime_numbers(n: i32) -> PyResult<Vec<i32>>
Wenn du siehst
Zunächst erklärt der Dekorator von # [pyfunction]
`, dass das Argument oder der Rückgabewert dieser Funktion ein von PyO3 analysiertes Python-Objekt enthält.
Diese `get_prime_numbers``` Funktion verwendet int32 als Argument und gibt eine Liste von Primzahlen zurück, die kleiner als diese sind. Zu diesem Zeitpunkt lautet der Rückgabewert "PyResult <Vec <i32 >>". Dieses
PyResult``` stammt von`` use pyo3 :: prestude :: *; ``
.
Außerdem entspricht `Vec <i32>`
der folgenden Typkorrespondenztabelle und wird von PyResut in den Typ Python List konvertiert.
Rust | Python |
---|---|
i32 , usize etc |
int |
f32 , f64 |
float |
bool |
bool |
Vec<T> |
list |
String |
str |
HashMap |
dict |
Zitiert aus [Rust] Python-Paket mit PyO3 erstellen
Auch der letzte
Ok(primes)
Konvertiert `Vec``` in`
list```.
Es tut mir leid, dass Sie, wenn Sie hier enden, eine Kopie der meisten Referenzen erhalten. Ich werde es hier einmal trennen.
Zusammenfassend,
Das ist es.
Fügen Sie als Nächstes lib.rs
hinzu, fügen Sie setup.py
hinzu und kompilieren Sie es tatsächlich als Objektdatei der Bibliothek.
Diesmal hier.
Ende.
Recommended Posts