如何在你的项目中混合 Rust 和 Python
在在2021年StackOverflow年度开发者调查[1]中,Rust被评为“最受欢迎的语言”(连续第六年!),Python被评为“最受欢迎”的语言。那么为什么不混合两种语言呢!本次介绍将建立一个结合Python和Rust代码的混合项目。
为什么?Python解释方法和动态类型加速了我们的开发工作流程。但是对于更复杂的工作,我们经常会遇到性能问题。
Rust是实现Python项目本机性能升级的理想选择。本机优化使用低级语言和编译器绕过Python解释器。
通过结合Rust和Python,您可以获得两全其美:使用Python的快速交互式开发环境和使用Rust的本机性能。
Python+Rust项目—作者的图片
在以下部分中,我将设置一个混合Python/Rust项目的示例。我们的项目将在同一个项目和工件中结合Python代码和Rust。
混合项目的好处是显而易见的:您在同一个存储库中共享您的Rust和Python代码并创建一个工件。结果,您将两种语言结合在同一个项目中;使用原生Rust组件迭代和扩展Python代码变得更加容易。此外,只需部署一个工件,就可以更轻松地维护和共享您的项目。
缺点很明显:两种语言在同一个目录下,如何构建、测试和部署这样的项目?
集成Rust和Python的主要方式是PyO3框架。使用PyO3,我们可以用Rust编写原生Python模块。当然,该框架也支持从Rust调用Python,但我将只关注使用原生Rust模块扩展Python。
PyO3将您的Rust代码包装到本机python模块中。因此,绑定生成很容易且完全透明。
棘手的部分是构建混合Python和本机代码项目(Python+[Rust、C或C++])时代码的打包。那么如何制作集成Python和原生代码的轮子呢?
Python代码无需编译即可分发,与平台无关;安装轮子会.pyc即时创建文件(Python字节码)。但是我们的Rust代码需要编译和分发为共享库(二进制代码)。
打包是这个项目的难点:创建一种通用的、多平台的方式来生成混合Python-Rust包。
可以帮助您实现此目的的工具是Maturin。Maturin管理创建、构建、打包和分发混合Python/Rust项目。
PyO3+Maturin—图片作者
首先,使用pip.
它包括maturin二进制文件,一个命令行界面。
可执行文件提出了maturin几个选项。让我们放大构建和开发。
为了测试一个混合的Rust-Python项目,我们现在可以使用maturinnew命令初始化我们的库。
对于我们的项目,我们使用选项–bindingspyo3和–mixedmy_project.该my_project参数与此示例的目标项目目录匹配。
生成的项目将目录中的Python包my_project与Rust项目定义Cargo.toml和基于Rust的src目录集成在一起。
好的,我们有了基本的项目骨架。我们现在可以添加一个简单的Rust函数来公开。
项目结构—作者图片
我们需要在Python运行时可调用的Python模块中声明和导出Rust函数。我们首先使用#[pymodule]Rust宏创建一个模块。在我们的函数中,my_project我们将声明Rust和Python之间的绑定。
让我们从<>块的简单函数开始。我们的导出函数is_prime通过将其除以前面的数字来检查其输入的素数。对于数字num,我们检查2和之间数字的除法余数√num。
在<>块中,我们将函数添加到导出的模块中。
在该<>块中,我们添加了一些简单的单元测试。
使用Maturin,构建一个原生Rust模块并将其导出到Python解释器中只需一行代码。
该命令构建Rust原生模块并将其部署在当前的virtualenv中。
在引擎盖后面,命令maturindevelop:
我们可以在Python中添加一个简单的基于属性的测试来检查is_primeRust函数的行为。
我们首先为HypothesisPython包添加一个依赖项。要将依赖项添加到我们的项目中,我们可以编辑该pyproject.toml文件。Maturin支持PEP621,启用Python元数据规范。
我们现在可以运行maturindevelop命令了。
(1)使用–extrastestMaturin选项安装Python测试依赖项。
我们添加了一个简单的基于属性的测试。
我们终于可以运行基于属性的Python测试了。
还有我们的Rust测试。
主题测试文章,只做测试使用。发布者:最新稳定辅助网,转转请注明出处:https://www.744broad.com/14064.html