Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen einer einfachen Funktion 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? ??

Ultimatives Ziel

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.

Diesmal das Ziel

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.

Verfahren

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.

Stellen Sie Cargo.toml ein

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.

Erstellen Sie eine Funktion mit Rust

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, usizeetc 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```.

Zusammenfassung

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

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 ➁
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 ➁
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
C-Sprache zum Sehen und Erinnern Teil 3 Rufen Sie die C-Sprache aus Python auf (Argument) c = a + b
Betrachten Sie die Konvertierung von Python rekursiv in nicht rekursiv
So rufen Sie eine Funktion auf
[Python Kivy] So erstellen Sie ein einfaches Popup-Fenster
Vom Einrichten der Rust-Umgebung bis zum Ausführen von Hello World
Gehen Sie zur Sprache, um Teil 8 zu sehen und sich daran zu erinnern. Rufen Sie die GO-Sprache von Python aus auf
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.
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
Rufen Sie dlm von Python aus auf, um ein zeitvariables Koeffizientenregressionsmodell auszuführen
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Alles vom Erstellen einer Python-Umgebung bis zur Ausführung unter Windows
Rufen Sie Matlab von Python zur Optimierung auf
Numba als Python zu beschleunigen
Python - Dynamische Aufruffunktion von String
So beschleunigen Sie Python-Berechnungen
Einführung und Verwendung der Python-Flasche ・ Versuchen Sie, einen einfachen Webserver mit Anmeldefunktion einzurichten
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
Ein einfaches IDAPython-Skript zum Benennen einer Funktion
Aufrufbefehle von Python (Windows Edition)
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Python-Programm ist langsam! Ich möchte beschleunigen! In einem solchen Fall ...
Senden Sie eine Nachricht von Slack an einen Python-Server
Richten Sie mit Python 3 einen einfachen HTTPS-Server ein
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
So öffnen Sie einen Webbrowser über Python
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So generieren Sie ein Python-Objekt aus JSON
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Richten Sie einen einfachen SMTP-Server in Python ein
[Go] So schreiben oder rufen Sie eine Funktion auf
[Python] Geben Sie Ihr Bestes, um SQL Alchemy zu beschleunigen
Eine einfache Möglichkeit, Java von Python aus aufzurufen
Verschieben Sie auf einem PC, der nicht von NVMe booten kann, / usr usw. zu NVMe, um die Geschwindigkeit zu erhöhen
Python-Ertrag verstehen Wenn Sie Ertrag in eine Funktion einfügen, wird dieser in einen Generator geändert
[Es ist noch nicht zu spät, Python ab 2020 zu lernen] Teil 2 Erstellen wir eine Python-Entwicklungsumgebung
Ein Mechanismus zum Aufrufen von Ruby-Methoden aus Python, der in 200 Zeilen ausgeführt werden kann