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? ??

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

Es wird eine Fortsetzung von sein.

Diesmal das Ziel

Diesmal,

Ich werde es weiterhin tun.

Das ultimative Ziel ist In der Lage sein, Funktionen und Klassen (wie Dinge?) Einfach aufzurufen. Geschrieben in Rost von Python ist.

Übergeben Sie Rust-Funktionen an Python


//lib.Fortsetzung von 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))?;

    Ok(())
}

Hier, #[pymodule]Dekorateurtest_libraryErklärt, ein Python-Modul zu sein.

Und die vorherige `` `get_prime_numbers``` Funktion,


m.add_wrapped(wrap_pyfunction!(get_prime_numbers))?;

In diesem Modul als Funktion verpackt.

Schließlich ist es "Ok (())", und dieses Modul ist als Funktion definiert.

PyResult<()> 

Ich bin ein wenig besorgt, dass es ein leeres PyResult zurückgibt (die Void-Funktion kann damit umbrochen werden), Ich habe das Tutorial so geschrieben, wie es ist, vorausgesetzt, dieser Bereich ist magisch.

Erstellen Sie setup.py

Wir werden die bekannte setup.py erstellen, die auch in Cython verwendet wurde. Diesmal ist es einfach und leicht.

setup.py


from setuptools import setup
from setuptools_rust import Binding, RustExtension

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

Kann von der Python-Seite als "import test_library" aufgerufen werden.

RustExtension('test_library', 'Cargo.toml',
                binding=Binding.PyO3)],

Machen Sie dann das test_library Modul in lib.rs zu einer Bibliothek von pyo3. Derzeit ist es sehr einfach, die Abhängigkeit zu schreiben, die als "Cargo.toml" verwendet werden soll. ..

Versuche zu bauen

Nachdem wir fertig sind, können wir die Funktion von Python aus erstellen und aufrufen.


python setup.py install

Und Testcode

test.py


import test_library 
import time
import sys

def get_prime_numbers(n: int):
    flags = [True for _ in range(n+2)]

    upper = int(n ** 0.5)
    for i in range(2, upper+1):
        if not flags[i]:
            continue

        prime = i

        j = prime * 2
        while j <= n:
            flags[j] = False
            j += prime

    primes = []
    for i in range(2, n+1):
        if flags[i]:
            primes.append(i)

    return primes

if __name__  == "__main__":
    # just calling rust function from created library
    a = 123
    b = 456
    c = test_library.sum_as_string(a, b)

    print(c)


    
    # just calling rust function from created library, to find primes
    # rust is (of course) a lot faster than python
    # if you wanna call python function, python test.py, 
    # if you wanna call rust   function, python test.py --rust
    
    use_rust = len(sys.argv) == 2 and sys.argv[1] == "--rust"
    n = 10000


    t1 = time.time()
    for _ in range(10):
        if use_rust:
            primes = test_library.get_prime_numbers(n)
        else:
            primes = get_prime_numbers(n)

    t2 = time.time()

    print(f"time took is: {t2-t1} sec")

Zitiert aus [Rust-Modul von Python (PyO3) ausführen]](https://ohke.hateblo.jp/entry/2020/02/15/230000)

Ausführen.

python test.py

Eine Python-basierte Funktion läuft weiter

python test.py --rust

Ruft eine rostbasierte Funktion auf.

Ergebnis,


$ python test.py
time took is: 0.013466835021972656 sec

$ python test.py --rust
time took is: 0.0005574226379394531 sec

Und der Unterschied in der Ausführungsgeschwindigkeit wurde spürbar.

Zusammenfassung

Das ultimative Ziel ist In der Lage sein, Funktionen und Klassen (wie Dinge?) Einfach aufzurufen. Geschrieben in Rost von Python Es war, Dieses Mal habe ich erklärt, wie man eine in Rust geschriebene Funktion aus Python aufruft. Die einzige Typkonvertierung, die ich bisher behandelt habe, ist Vec-> List, daher werde ich im nächsten Artikel über andere Typen schreiben. Die Beschreibung ändert sich jedoch nicht viel, so dass es einfach ist.

Außerdem möchte ich darüber schreiben, wie man Rusts klassenähnliches Ding (Struct + -Methode) als Klassenobjekt auf der Python-Seite analysiert.

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
[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
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 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