使用PyO3从Python调用 Rust:加速Python

解道jdon 2021-11-25 15:39:18
Python 使用 调用 pyo3 pyo

使用 Rust 加速你的 Python:PyO3使从 Python 调用 Rust 代码变得容易。您可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合PyO3来编译 Rust 库并将其作为 Python 模块直接安装。其中,PyO3 可以在 Python 和 Rust 之间转换类型,并且可以通过一组宏轻松地将 Rust 函数导出到 Python。

在这篇博文中,我将简要介绍 PyO3。之后,我将讨论几个用 Rust 编写并从 Python 调用的示例函数。这些例子包括:

  • 在 Python 和 Rust 中计算第 n 个斐波那契数
  • 让 Python 在 Rust 函数中使用多种类型
  • 在 Python 代码中使用 Rust 结构
  • 使用 Python 将 JSON 发送到 Rust 并将该 JSON 序列化为结构
  • 允许 Rust 从 Python 运行时使用记录器
  • 在 Rust 中生成错误并将其作为异常在 Python 中捕获

 

PyO3 简介

PyO3 为想要将 Rust 和 Python 代码粘合在一起的人们提供了一些人体工程学设计。它可以帮助您从 Rust 调用 Python 代码以及从 Python 调用 Rust 代码。由于我只使用它从 Python 调用 Rust 代码,这是我在这里写的唯一内容。

那么 PyO3 给你什么?

首先,有maturin。该工具将为您编译 Rust 代码,并将编译后的代码作为 Python 模块安装在您的虚拟环境中。之后,您可以在 Python 代码中导入此模块并使用它。在您pip install maturin 之后,您只需要运行 1 个命令 ( maturin develop ) 即可在 Python 中使用 Rust 代码。

除了maturin,当然还有 PyO3 本身。PyO3 为 Python 解释器提供 Rust 绑定。这使得您不必真正为 Python 和 Rust 之间的交互而烦恼。例如,您不必担心如何在 C 中将 Python 字符串转换为某些内容,然后在 Rust 中再次转换为其他内容。整数、浮点数、列表、字典等也是如此。为了方便起见,PyO3 附带了许多宏,可以防止您编写过多的样板代码。要将 Rust 函数公开给 Python,您可以使用宏注释它们。在此之后,PyO3 将负责其余的工作。如果您想导出结构或方法,这同样适用。

 

从 Python 调用 Rust 函数

在第一个示例中,我们将从 Python 调用 Rust 乘法函数。通常,我们可以这样写:

fn multiply(a: isize, b: isize) -> isize {
    a * b
}

在不添加太多东西的情况下,我们可以让这个函数从 Python 中调用。首先,我们需要:

  • 引入pyo3 prelude
  • 注释函数#[pyfunction]以将其转换为 PyCFunction
  • 将结果包装在一个 PyResult
  • 将函数添加到 #[pymodule]

下面的代码以相同的顺序说明了上述步骤:

use pyo3::prelude::*;
#[pyfunction]
fn multiply(a: isize, b: isize) -> PyResult<isize> {
    Ok(a * b)
}
#[pymodule]
fn rust(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(multiply, m)?)?;
    Ok(())
}

以上将在一个名为rust(在最后一个函数的名称之后)的Python 模块中公开乘法函数。我们还需要放置适当的Cargo.toml文件。

为方便起见,请确保 Cargo.toml 中库的名称与使用#[pymodule]. 在我的示例中,我将以下内容放入我的Cargo.toml:

[lib]
name = "rust"

当这两个名称匹配时,maturin构建工具将使用该名称将 Rust 库安装为 Python 模块。

因此,在这种情况下,选择rust作为包的名称,我们可以编写以下 Python 来调用乘法函数:

import rust
result = rust.multiply(2, 3)
print(result)

为了能够运行此代码,我们需要编译 Rust 代码并将其安装为 Python 库。这是maturin进来的地方:

root@rust:/# git clone https://github.com/saidvandeklundert/pyo3.git
Cloning into 'pyo3'...
remote: Enumerating objects: 36, done.
    ...
Resolving deltas: 100% (9/9), done.
root@rust:/# cd pyo3/multiply/
root@rust:/pyo3/multiply# python3 -m venv .env
root@rust:/pyo3/multiply# source .env/bin/activate
(.env) root@rust:/pyo3/multiply# pip install maturin
Collecting maturin
    ...
Installing collected packages: toml, maturin
Successfully installed maturin-0.11.5 toml-0.10.2
(.env) root@rust:/pyo3/multiply# maturin develop
 Found pyo3 bindings
 Found CPython 3.9 at python
   Compiling proc-macro2 v1.0.32
    ...
   Compiling multiply v0.1.0 (/pyo3/multiply)
    Finished dev [unoptimized + debuginfo] target(s) in 23.48s
(.env) root@rust:/pyo3/multiply# python3 multiply.py
6

现在我可以运行这个脚本::

(.env) root@rust: multiply# python3 multiply.py
6

更多点击标题

版权声明
本文为[解道jdon]所创,转载请带上原文链接,感谢
https://www.jdon.com/57753

  1. Using Python 3 to make practical software for drawing modification
  2. About HTML (acceptable to Python)
  3. Python集成學習:自己編寫構建AdaBoost分類模型可視化决策邊界及sklearn包調用比較
  4. PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗發水銷售數據
  5. Python Integrated Learning: Writing and Constructing adaboost Classification Model Visualized decision Boundary and sklearn package Calling Comparison
  6. Python prédit les données de vente de shampooing de séries chronologiques en utilisant la méthode d'optimisation des paramètres du réseau neuronal de mémoire à court et à long terme lstm
  7. [zero basics of Python to introduction] a prerequisite for Python preparatory knowledge -- basic coding specification of Python
  8. OpenCV对比度亮度变换竟能用来去水印(附Python/C++源码)
  9. [zero basics of Python to getting started] a prerequisite for Python preparatory knowledge -- installing the visualization tool pycharm
  10. The test modifies main.py in micro python
  11. Microphoton experimental circuit board based on mm32f3273 - does not work normally
  12. Run micropathon on mm32f3273 to test performance
  13. Design mm32f3277 micro Python experimental board with SD card
  14. Mm32f3277 corresponding interface files during microphoton migration
  15. Mm32f3277 microphoton experimental board design and software testing
  16. Making and testing mm32f3277 microphoton minimum circuit board
  17. Download mm32-link program automatically with Python simulated mouse
  18. A curriculum of "artificial intelligence Python machine learning and deep learning"
  19. Test the basic functions of mm32 microphoton test circuit board
  20. Test the basic functions of the mm32f3277 micro Python development board flying one by one
  21. Debugging mm32f3277 from zhufei, transplanted with micro Python development board
  22. Recognizing numbers using OpenCV and python
  23. 真的太香了,Python速查表终于出中文版了
  24. Django REST Framework(DRF)教程:快速入门
  25. python django objects filter过滤查询:startswith year
  26. Data encapsulation of Excel test cases in Python
  27. 学员管理系统python
  28. 肝了一夜,8000字概括精髓,pandas必知必会50例!
  29. Python竟然可以画漫画!漫画版的故宫导游图,来袭!
  30. Networkx graph theory Dijkstra algorithm shortest path implementation, Python
  31. Draw a HelloWorld with Python turtle Library
  32. 运行django的服务器内存使用偶尔跳高一点,重启服务马上下来,是内存泄露吧
  33. Basic usage of Python tqdm module in machine learning training
  34. Python -- basic usage method and basic template of argparse module
  35. python-sockertserver并发编程思想
  36. Programmation simultanée du serveur de sockets Python
  37. Vue+Django 旅游网项目 首页前端实现
  38. [learning notes] Python - pyecarts
  39. Python automated operation and maintenance -- actual combat (I)
  40. Classic usage of pandas: iloc and LOC of data filtering
  41. Python 多分支语句的三种结构
  42. Calendar module of Python time series
  43. Python 输出指定范围的闰年
  44. A super easy to use Python standard library. It's great to operate directories and files
  45. Fatal Python error: init_ fs_ encoding: failed to get the Python codec of the filesystem encoding
  46. Using Python to obtain a video address is as simple as
  47. #yyds干货盘点# 6. Python 元组,不可变的列表,滚雪球学 Python
  48. Yyds Dry Inventory # 6. Python tuples, invariant List, snowball Learning Python
  49. You cannot enter the registration page using Django registration redux
  50. 笨办法学Python第十八天:更多文件操作
  51. Python编辑代码,帮个忙呗
  52. pandas转换object为int失败了,有人能解答吗
  53. python解释题,解释这串,所代表的意思
  54. 用python用while语句写1000以内能被5和9整除的数和个数
  55. #python 我写了一个“饭店”程序
  56. Comprehensive application of Python foundation -- Development
  57. Écrivez en python le nombre et le nombre d'entiers qui peuvent être divisés par 5 et 9 jusqu'à 1000 dans une instruction while
  58. You can learn Python articles without reading online classes (day 4)
  59. You can learn Python articles without reading online classes (the third day)
  60. You can learn Python articles without reading online classes (the next day)