Es wird eine Fortsetzung von sein.
Diesmal,
lib.rs
hinzugefügtsetup.py
hinzu und kompilieren Sie tatsächlichIch 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.
//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_library
Erklä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.
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. ..
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.
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