首页 数字货币交易所文章正文

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

数字货币交易所 2022年07月25日 08:27 150 Connor

上海一站式IT外包服务,上海希尼亚偌信息科技有限公司专注IT领域多年,致力于 IT外包 、IT运维、网络维护、系统集成等多项IT外包服务,服务网点遍及上海各区,数十年来已为数百家知名企业及上市企业提供过IT技术服务。欢迎您来电咨询,我们将竭诚为您服务...

Portishead1 / Getty图像

Python 和 Rust 似乎占据了语言频谱的两端。 在运行时解释的 Python 为开发人员提供了一个灵活舒适的编程环境,但代价是原始速度。 Rust 提供速度和内存安全保证,但要求您学习处理内存操作的新范式。

理论上,这些语言不应该竞争。 他们应该合作。 在实践中,他们可以。 Rust 可以受益于 Python 的易用性,而 Python 可以受益于 Rust 的速度和安全性。

如果您想将 Rust 与 Python 或 Python 与 Rust 一起使用,您至少需要熟悉这两种语言才能获得最佳结果。 您还需要确定这两种语言中的哪一种是您的主要语言,因为每种方法的选项都大不相同。

使用 PyO3 从 Python 调用 Rust

如果 Python 是您的主要语言,那么与 Rust 集成在概念上与将 Python 与 C 集成的方式相同。用 C 编写的 Python 的默认实现使用用 C 编写或使用与 C 兼容的 ABI 的扩展。用 Rust 编写的使用相同 ABI 的扩展也可以工作,尽管这不是自动的——你必须使用专门为 Rust 函数与 Python C API 提供绑定的 crates。

在 Python 中创建 Rust 绑定

在 Python 中创建 Rust 绑定的最广泛认可的项目是 PyO3。它可用于在 Rust 中编写 Python 模块,或将 Python 运行时嵌入到 Rust 二进制文件中。

PyO3 利用了另一个项目 Maturin,这是一个使用 Python 打包和绑定来创作 Rust crates 的工具。当安装在 Python 虚拟环境中时,可以从命令行使用 Maturin 来初始化启用 Python 绑定的新 Rust 项目。开发人员在 Rust 代码中使用指令来指示要向 Python 公开哪些 Rust 函数,以及如何将整个 Rust 项目作为可导入模块公开给 Python。

展开全文

映射 Rust 和 Python 类型

PyO3 的有用方面之一是它在 Rust 和 Python 类型之间的映射。用 Rust 编写的函数可以接受原生 Python 类型或从 Python 类型转换的 Rust 类型。例如,Python 中的 bytearray 或 bytes 对象可以优雅地映射到 Rust 中的 Vec<u8>,Python 中的 str 可以呈现为 Rust 字符串。

从 Python 转换为 Rust 会产生每次调用的成本,但它使您不必在 Rust 代码中完全使用 Python 类型。在 Cython 世界中,这类似于转换为 C 类型:每次转换都有成本,但如果您的目标是完全在 C 中进行数值处理,它们会带来重大的加速。

使用 cpython crate 从 Rust 调用 Python

如果您主要是 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 模块)之间的集成。

“人才大战发生了巨大变化,”咨询公司 Metis Strategy 副总裁 Alex Kraus 说。“人才库要大得多,有时甚至是全球性的,以前仅限于公司总部所在的地方。”

上海希尼亚偌数十年专注于一站式IT外包业务、IT系统集成服务、IT运维管理服务。

标签: 使用 Python Rust 何在 以及

发表评论

火币交易所-比特币交易_火币app下载-火币网官网 备案号:川ICP备66666666号