为什么要用Rust取代C/C ++重写Python底层?

Rust是Mozilla开发的注重性能和内存安全的语言,它的设计目的是逐渐取代C/C ++,但这个过程还需要一段时间。

值得肯定的是,Rust在现有阶段可以取代传统上部分C语言库。用于统计和机器学习的Python系统中的大部分内容都是用C语言编写而成的,所以模块被重写的可能性非常大。

图0:为什么要用Rust取代C/C ++重写Python底层?

虽然Rust是编译型语言,Python是解释型语言,但是由于两者的ABI(应用程序二进制接口)在设计上存在相似性,Rust代码可以应用到Python上。现在一些Rust包已经被用于Python绑定,通过Rust库也可以将C语言的API应用到Python上。

大量新项目的应用使得开发Rust库更容易,方便绑定Python和部署具有Rust二进制文件的Python软件包。下面4个项目的实际应用,说明结合Python与Rust在一定程度上完全可以取代C/C ++。

Rust-CPython

定义:Rust-Cpython就是在Rust中CPython运行时的一组绑定,Rust程序连接到CPython上,使用它的ABI来运行Python程序,在Rust环境下与Python的面向对象一起工作。

适用对象:熟练使用控制CPython的Rust程序员。需要注意的是,由于Python对象管理方式的问题,Rust的内存安全性能并不能完全发挥作用,所以使用要谨慎。

图1:为什么要用Rust取代C/C ++重写Python底层?

PyO3

定义:对于Rust开发人员来讲,PyO3项目提供了两个方向的基本方法来编写绑定Python的Rust软件。Rust程序可以与Python对象和解释器接口,并且可以与C模块相同的方式将Rust应用到Python中。

PyO3支持的Python功能有限,但是实现最基本的功能还是可以的。PyO3惯用的Rust功能是通过装饰既有代码去实现Python-aware。

适用人员:那些编写与Python运行直接交互模块的程序员。

Snaek

定义:在这个项目的早期阶段,Snaek允许开发人员根据需要创建加载Python动态的Rust库,但是这个Rust库不依赖于静态连接Python的运行。Rust库使用Snaek时,不需要专门针对Python进行编写,只公开C语言兼容的方法就可以了。但Snaek的一个潜在缺点是不能使用ctypes,ctypes是与C代码接口的标准Python库,它使用的是cffi。cffi是由PyPy团队开发的一个备选库,学习cffi并不难,但如果真的要使用cffi,一些已经使用ctypes的项目都需要重写。

适用人员:将Rust写入的方法应用到Python脚本中或想对Python做进一步了解的Rust程序员。

图2:为什么要用Rust取代C/C ++重写Python底层?

Cookiecutter

定义:这个项目涉及将二进制模块与Python库绑定时出现的常见问题。Cookiecutter从模板创建Python项目,可用的模板Cookiecutter PyPackage Rust Cross-Platform Publish简化了将Rust二进制文件与Python库捆绑在一起的过程。

这个项目非常重要的目标是能够生成二进制分发(Wheel),这样就不需要最终用户自己编译Rust代码。Windows用户经常因为缺乏预编译的Windows二进制Python包在工作中受阻,所以这个项目应该是非常受欢迎的。

适用人员:那些用Rust绑定创建许多Python项目或试图发布项目的程序员。

余下全文(1/3)
分享这篇文章:

请关注我们:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注