如何在 Python 中使用 Rust,以及在 Rust 中使用 Python



Python 和 Rust 似乎占据了语言范围的相反两端。在运行时解释的 Python 为开发人员提供了一个灵活舒适的编程环境,但代价是原始速度。 Rust 提供速度和内存安全保证,但要求您学习处理内存操作的新范式。
理论上,这些语言不应该竞争。他们应该合作。在实践中,他们可以。 Rust 可以受益于 Python 的易用性,而 Python 可以受益于 Rust 的速度和安全性。
如果您想将 Rust 与 Python 或 Python 与 Rust 一起使用,您至少需要熟悉这两种语言才能获得最佳结果。您还需要确定这两种语言中的哪一种是您的主要语言,因为每种方法的选项都大不相同。 如果 Python 是您的主要语言,那么与 Rust 集成在概念上与将 Python 与 C 集成的方式相同。
Python 的默认实现是用 C 编写的,它使用用 C 编写的扩展或使用与 C 兼容的 ABI。用 Rust 编写的使用相同 ABI 的扩展也可以工作,尽管这不是自动的——你必须使用专门为 Rust 函数提供与 Python C API 的绑定的 crate。 在 Python 中创建 Rust 绑定的最广为人知的项目是 PyO3。
它可用于在 Rust 中编写 Python 模块,或将 Python 运行时嵌入到 Rust 二进制文件中。 PyO3 利用了另一个项目 Maturin,这是一个使用 Python 打包和绑定来创作 Rust crates 的工具。当安装在 Python 虚拟环境中时,可以从命令行使用 Maturin 来初始化启用 Python 绑定的新 Rust 项目。
开发人员使用 Rust 代码中的指令来指示要向 Python 公开哪些 Rust 函数,以及如何将整个 Rust 项目作为可导入模块公开给 Python。 PyO3 的有用方面之一是它在 Rust 和 Python 类型之间的映射。用 Rust 编写的函数可以接受原生 Python 类型或从 Python 类型转换的 Rust 类型。
例如,Python 中的 bytearray 或 bytes 对象可以优雅地映射到 Rust 中的 Vec,而 Python 中的 str 可以是呈现为 Rust 字符串。 从 Python 转换为 Rust 会产生每次调用的成本,但它使您不必在 Rust 代码中完全使用 Python 类型。在 Cython 世界中,这类似于转换为 C 类型:每次转换都有成本,但如果您的目标是完全在 C 中进行数值处理,它们会带来重大的加速。
如果您主要是 Rust 开发人员,但想在 Rust 应用程序中使用 Python,cpython crate 是一种直接的方法。 cpython crate 为 CPython 解释器提供 Rust 绑定,这是最常见的 Python 运行时(如此命名是因为它是用 C 编写的)。 Rust 程序可以调用 CPython 解释器并使用它,允许您在 Rust 中创建和操作 Python 对象并进行库调用。
文档中的一个示例展示了如何初始化 Python 运行时、导入模块、创建 Python 对象、并执行方法调用。 cpython crate 还包括一些有用的宏。 py_fn!例如,宏封装了一个 Rust 函数,以便可以从 Python 调用它。
py_class!宏允许您将 Rust 类生成为 Python 类对象。 如果您对 Rust 比 Python 更熟悉,那么在深入研究之前,最好先熟悉 Python C API 和各种 Python 对象类型。 cpython 和 PyO3 的一个重要警告是始终尽量减少数据在两种语言之间来回传递的次数。
从 Python 到 Rust 的每次调用,反之亦然,都会产生一些开销。如果开销超过了您在 Rust 中所做的工作,您将看不到任何显着的性能改进。 例如,如果您正在循环对象集合,请将对象发送到 Rust 并在那里执行循环。
这比在 Python 端循环并在循环的每次迭代中调用 Rust 代码更有效。 本指南通常也适用于 Python 与使用 Python C ABI 的其他代码(例如 Cython 模块)之间的集成。

Yorumlar

Bu blogdaki popüler yayınlar

只需50美元即可训练成为一名熟练的Python编码器

DataStax 使 Astra 流媒体服务普遍可用

TypeScript 4.1 Beta带来了模板文字类型