厌倦了C++,CS&ML博士用Rust重写Python扩展,还总结了9条规则

面向网络攻击行为可视化分析系统实现【WebSocket + 可视化】 本系统主要应用于网站运维管理,它解决了网站运维人员排查网络攻击行为复杂且繁琐等问题,提高了运维人员网络安全分析的效率和准确性。 阅读详情

Python 是数据科学家最流行的编程语言之一,其内部集成了高质量分析库,包括 NumPy、SciPy、自然语言工具包等,这些库中的许多都是用 C 和 C++ 实现的。

然而,C 和 C++ 兼容性差,且本身不提供线程安全。有研究者开始转向 Rust,重写 C++ 扩展。

拥有 CS 与机器学习博士学位的 Carl M. Kadie ,通过更新 Python 中生物信息学软件包 Bed-Reader,为研究者带来了在 Rust 中编写 Python 扩展的九个规则。以下是原博客的主要内容。

一年前,我厌倦了我们软件包 Bed-Reader 的 C++ 扩展,我用 Rust 重写了它,令人高兴的是,得到的新扩展和 C/C++ 一样快,但具有更好的兼容性和安全性。一路走来,我学会了这九条规则,可以帮助你创建更好的扩展代码,这九条规则包括:

1. 创建一个包含 Rust 和 Python 项目的单独存储库

2. 使用 maturin & PyO3 在 Rust 中创建 Python-callable translator 函数

3. 让 Rust translator 函数调用 nice Rust 函数

4. 在 Python 中预分配内存

5. 将 nice Rust 错误处理翻译 nice Python 错误处理

6. 多线程与 Rayon 和 ndarray::p arallel,返回任何错误

7. 允许用户控制并行线程数

8. 将 nice 动态类型 Python 函数翻译成 nice Rust 泛型函数

9. 创建 Rust 和 Python 测试

其中, 文中提到的 nice 这个词是指使用最佳实践和原生类型创建 。换句话说:在代码顶部,编写 nice Python 代码;在中间,用 Rust 编写翻译 代码;在底部,编写 nice Rust 代码。结构如下图所示:

上述策略看似显而易见,但遵循它可能会很棘手。本文提供了有关如何遵循每条规则的实用建议和示例。

我在 Bed-Reader 进行了实验, Bed-Reader 是一个 Python 包 ,用于读取和写入 PLINK Bed Files,这是一种在生物信息学中用于存储 DNA 数据的二进制格式。Bed 格式的文件可以达到 TB。Bed-Reader 让用户可以快速、随机地访问数据的子集。它在用户选择的 int8、float32 或 float64 中返回一个 NumPy 数组。

我希望 Bed-Reader 扩展代码具有以下特点:

  • 比 Python 快;

  • 兼容 NumPy;

  • 可以进行数据并行多线程处理;

  • 与执行数据并行多线程的所有其他包兼容;

  • 安全。

我们最初的 C++ 扩展兼具速度快、与 NumPy 兼容,以及使用 OpenMP 进行数据并行多线程等特点。遗憾的是,OpenMP 运行时库 (Runtime library),存在 Python 包兼容版本问题。

Rust 提供了 C++ 扩展带来的优势。除此之外,Rust 通过提供没有运行时库的数据并行多线程解决了运行时兼容性问题。此外,Rust 编译器还能保证线程安全。

在 Rust 中创建 Python 扩展需要许多设计决策。根据我使用 Bed-Reader 的经验,以下是我的使用规则。

规则 1:创建一个包含 Rust 和 Python 项目的单独存储库

下表显示了如何布局文件:

使用 Rust 常用的‘cargo new’命令创建 Cargo.toml 和 src/lib.rs 文件。Python 没有 setup.py 文件。相反,Cargo.toml 包含 PyPi 包信息,例如包的名称、版本号、 README 文件的位置等。要在没有 setup.py 的情况下工作,pyproject.toml 必须包含:

<span style="color:#444444"><span style="background-color:#f6f6f6"><code>[build-<span style="color:#397300">system</span>]</code>
<code>requires = [<span style="color:#880000">"maturin==0.12.5"</span>]</code>
<code>build-backend = <span style="color:#880000">"maturin"</span></code>
</span></span>

一般来说,Python 设置在 pyproject.toml 中(如果不是,则在 pytest.ini 等文件中)。Python 代码位于子文件夹 bed_reader 中。

最后,我们使用 GitHub 操作来构建、测试和准备部署。该脚本位于 .github/workflows/ci.yml 中。

规则 2:使用 maturin & PyO3 在 Rust 中

创建 Python-callable translator 函数

Maturin 是一个 PyPi 包,可通过 PyO3 构建和发布 Python 扩展。PyO3 是一个 Rust crate,用于在 Rust 中编写 Python 扩展。

在 Cargo.toml 中,包含这些 Rust 依赖项:

<span style="color:#444444"><span style="background-color:#f6f6f6"><code>[<span style="color:#333333"><strong>dependencies</strong></span>]</code>
<code>thiserror = <span style="color:#880000">"1.0.30"</span></code>
<code>ndarray-npy = { version = <span style="color:#880000">"0.8.1"</span>, <span style="color:#333333"><strong>default</strong></span>-features = <span style="color:#333333"><strong>false</strong></span> }</code>
<code>rayon = <span style="color:#880000">"1.5.1"</span></code>
<code>numpy = <span style="color:#880000">"0.15.0"</span></code>
<code>ndarray = { version = <span style="color:#880000">"0.15.4"</span>, features = [<span style="color:#880000">"approx"</span>, <span style="color:#880000">"rayon"</span>] }</code>
<code>pyo3 = { version = <span style="color:#880000">"0.15.1"</span>, features = [<span style="color:#880000">"extension-module"</span>] }</code>
<code>[dev-<span style="color:#333333"><strong>dependencies</strong></span>]</code>
<code>temp_testdir = <span style="color:#880000">"0.2.3"</span></code>
</span></span>

在 src/lib.rs 底部,包含这两行:

<span style="color:#444444"><span style="background-color:#f6f6f6"><code><span style="color:#333333"><strong>mod</strong></span> python_module;</code>
<code><span style="color:#333333"><strong>mod</strong></span> tests;</code>
</span></span>

规则 3:Rust translator 函数

调用 nice Rust 函数

在 src/lib.rs 定义了 nice Rust 函数,这些函数将完成包的核心工作。它们能够输入和输出标准 Rust 类型并尝试遵循 Rust 最佳实践。例如,对于 Bed-Reader 包, read_n

用Python可视化硅晶体生长:3D图解<100>/<110>/<111>晶向差异 本文通过Python 3D可视化技术,详细解析了硅晶体生长中<100>、<110>、<111>三种关键晶向的差异及其在半导体工业中的应用。从密勒指数转换到原子密度计算,结合交互式3D模型展示不同晶向的原子排列特性,帮助读者深入理解晶向对芯片性能的影响。 阅读详情

相关推荐

利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)

1、知识概述 (1)软件定义网络: (2)mininet: Mininet是一个强大的网络仿真平台,通过这个平台,我们可以很方便的模拟真实环境中的网络操作与架构。特别是SDN,在真实网络中进行相关的网络实验有一定难度,自然需要一个仿真平台可以学习这种新型的网络架构,而Mininet就应运而生,承担了这个光荣而艰巨的使命。Mininet自带交换机(switchs)、主机(hosts)、控制器(controllers),同时,在mininet上可以安装OpenvSwitch、多种控制器(NOX\POX

北风 1万+

光线追踪渲染实战:蒙特卡洛路径追踪及其c++实现

光线追踪超越了传统的图形流水线,是一种现代的渲染。光线追踪是一种基于物理的渲染方法,通过模拟光在介质中的真实表现来输出足以逼近现实的图像。光线从光源出发,经过各种反射折射,进入摄像机。通过渲染方程描述一点的颜色,并且通过蒙特卡洛方法求解渲染方程来获取最终的像素颜色。

AKGWSB 's blog 1万+

【TCAX相关】Python 官方手册下载页面(中文+英文)

Python 官方手册下载页面(中文+英文) 中文: https://docs.python.org/zh-cn/3.8/archives/ https://docs.python.org/zh-cn/3.6/archives/ 英文: https://www.python.org/doc/versions/ https://docs.python.org/3/archives/ https://www.python.org/ftp/python/doc/ ...

Seekladoom的博客 1013

Xilinx平台Aurora IP介绍(汇总篇)

Aurora IP核使用超简单的,COME ON!

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

在 SAP S/4HANA Public Cloud 中,用 RAP 一键生成 PDF 并在 Fiori 前端触发下载的完整方案

create;update;delete;// 生成并返回当前文档上下文。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 417

主题035:计算流体力学(CFD)

计算流体力学(Computational Fluid Dynamics, CFD)是利用数值方法求解流体流动、传热传质等问题的学科。CFD已成为化学反应工程中反应器设计和优化的重要工具。∂ρ∂t+∇⋅(ρu)=0 \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = 0 ∂t∂ρ​+∇⋅(ρu)=0对于不可压缩流动:∇⋅u=0 \nabla \cdot \mathbf{u} = 0 ∇⋅u=0动量方程:∂(ρu)∂t+∇⋅(ρ

kkchenjj的博客 269

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1152

vue3 - 高德地图定位出错Get ipLocation failed.Geolocation permission denied.(info: “FAILED“ | status: 0)报错解决!

vue3,nuxt3,高德地图,定位,位置,报错,AMap.Geolocation,解决报当前定位失败,高德地图H5 定位失败报错,web网页网站,报错详细解决教程,Get ipLocation failed.Geolocation permission denied.,高德地图定位报错info: "FAILED",高德地图status: 0,已经是https了还是报错,确保了浏览器位置已经开了,手机定位也开了,没解决,H5页面在ios的浏览器上使用 高德地图 报当前定位失败Geolocation,移动端设

✅ 精选推荐文章 6771

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: Python两处容易理解错误的设计
下一篇: 推荐 3 个 Python 时序分析神器
Python_xiaowu
博客等级 码龄5年 3096粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值