用Rust帮Python加加速

使用PyO3从Python调用 Rust:加速Python 使用 Rust 加速你的 Python:PyO3使从 Python 调用 Rust 代码变得容易。您可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合PyO3来编译 Rust 库并将其作为 Python 模块直接安装。其中,PyO3 可以在 Python 和 Rust 之间转换类型,并且可以通过一组宏轻松地将 Rust 函数导出到 Python。 在这篇博文中,我将简要介绍 PyO3。之后,我将讨论几个用 Rust 编写并从 Python 调用的示例函数。这些例子包括:. 阅读详情

背景

长期以来,Python由于易上手,有GC且生态强大等特点被广泛使用,可是渐渐的人们也发现了它的不足,解释型语言的运行速度终究比不过编译型,况且由于Python设计时的动态数据类型一切皆对象(内存都分配在堆上)等思想,也导致了运行速度缓慢.

随着实时性要求的不断提升,在一些计算量大要求快速响应的场景传统的Python就很难满足要求,所以随之慢慢有了各种解决办法:

  • 用更高效的解释器
  • 用jit即时编译加速
  • 改写成Cython加速
  • 对GIL动手,提高多线程性能
  • …

其中目前使用最广泛,最有效的应该是jit与Cython这两种方案,jit即时编译可以将部分需要解释的代码直接转为机器码从而实现加速(减少解释时开销);而Cython更绝直接将Python原地升级,得到一个Cython这个Python与C的混血,可以通过Cython将代码翻译成C/C++的代码再编译成动态库文件供使用.可是这样就会造成Python原本的语法被改的“四不像”,这些后面慢慢再谈.

既然都用上动态库了,为什么不直接使用C++或者其他高效语言实现,然后供Python调用呢?说到底,Cython不也是翻译成C/C++的代码编译使用,只是为了方便Python开发人员才设计了这种类似于Python的语法.如果熟悉其他语言的话完全可以直接使用其他语言实现而不影响Python的基本语法.所以今天就来讨论一下关于使用Rust对Python计算进行加速的问题.

Rust加速Python计算

首先,来看看Rust实现和Python实现基本的速度对比,目标是求斐波那契数列第n项的值.其中实现均采用递归调用,为了突出时间差异这里求第30项的值并重复50次

Python的实现与耗时如下:

import time
​
def fib(n:int) ->int:
    assert n>=0
    if n <= 1:
        return n
    return fib(n-1)+fib(n-2)
​
def main(test_times=50):
    start = time.time()
    for _ in range(test_times):
        fib(30)
    print(f"time cost {time.time()-start} s")
​
if __name__ == '__main__':
    main()

image-20230906164123387

Rust的实现与耗时如下:

use std::time;
​
fn fib(n:i32)->u64{
    if n<=0{
        panic!("{} must be a postive number!",n);
    }
    match n{
        1|2 => 1,
        _ => fib(n-1) + fib(n-2)
    }
}
​
fn main() {
    let test_times = 50;
    let start = time::Instant::now();
    for i in 0..test_times{
        fib(30);
    }
    println!("time cost {:?}",start.elapsed())
}
​

image-20230906164314741

这差异,足足一百多倍.那看来使用Rust提速是完全可行的,那怎么将Rust与Python相结合呢?或者如何把Rust的代码编译供Python调用,这个时候可以使用pyo3,首先安装一下maturin工具pip install maturin,然后配置一下项目的Cargo.toml

[package]
name = "speedup_python"
version = "0.1.0"
edition = "2021"
​
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
​
[lib]
name = "speed_python"
crate-type = ["cdylib"]
​
[dependencies]
pyo3 = { version = "0.19.2", features = ["extension-module"] }

这里编译类型就设置为lib,关于多种不同lib类型的区别可以去看看Rust专栏之前的内容.这里的name就是未来Python中调用的名字,下面再编写lib.rs

use pyo3::prelude::*;
use pyo3::wrap_pyfunction;
​
#[pyfunction]
pub fn fib(n:i32)->u64{
    if n<=0{
        panic!("{} must be a postive number!",n);
    }
    match n{
        1|2 => 1,
        _ => fib(n-1) + fib(n-2)
    }
}
​
#[pymodule]
fn speed_python(_py:Python,m:&PyModule)->PyResult<()>{
    m.add_wrapped(wrap_pyfunction!(fib))?;
    Ok(())
}

逻辑代码基本没有更改,只是添加了Rust实现Python module的代码,这里的module name必须和toml中设置的name保持一致,否则也会无法导入.

最后运行maturin develop就可以实现编译,给Python调用了.

加速对比

现在,我们已经实现了Rust的加速,是不是非常简单而且调用的时候可以使用原本的Python语法而不用进行任何更改.下面就来对比一下原始,numba,Cython,Rust四种方式的速度对比.

其中Cython实现cpy_fib.pyx如下

cpdef int c_fib(n:int):
    assert n>0
    if n in [1, 2]:
        return 1
    else:
        return c_fib(n - 1) + c_fib(n - 2)

然后写setup进行编译

from distutils.core import setup,Extension
from Cython.Build import cythonize
​
setup(
    ext_modules=cythonize(Extension(
        'cpy_fib',
        sources=['./cpy_fib.pyx'],
        language='c'
    )),
)

运行python setup.py build_ext --inplace编译,最后整体对比

import speed_python
import time
from cpy_fib import c_fib
from numba import jit
​
​
@jit(nopython=True)
def fib_jit(n: int) -> int:
    assert n > 0
    if n in [1, 2]:
        return 1
    else:
        return fib_jit(n - 1) + fib_jit(n - 2)
​
def fib(n: int) -> int:
    assert n > 0
    if n in [1, 2]:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
​
​
def test_speed(func,func_name:str,test_times=50):
    start = time.time()
    for _ in range(test_times):
        func(30)
    print(f"{func_name} speed up time cost {time.time() - start} s")
​
​
def main(test_times=50):
    test_speed(fib,"origin python")
    test_speed(fib_jit,"numba python")
    test_speed(speed_python.fib,"rust")
    test_speed(c_fib,"Cython")
​
​
if __name__ == '__main__':
    main()

image-20230911164701823

加速方法耗时(ms)
原始4144
Numba441
Cython804
Rust178

这加速对比也证明了在一些计算任务中Rust能更高效的实现,并且不影响原始Python的代码语法或者结构,只需要编译调用.完全可以分配不同开发人员同时开发,最后整合测试调用即可.

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

Python-使用Rust来扩展Python的例子 使用Rust来扩展Python的例子 立即下载

相关推荐

Jaspersoft Studio安装与配置全攻略:从下载到首个报表生成

本文提供Jaspersoft Studio从下载、安装到创建首个报表的完整实战指南。详细介绍了如何获取安装包、配置工作空间,并通过可视化设计器创建报表模板、添加参数与字段,最终实现数据预览与PDF导出。帮助Java开发者快速掌握这一强大的开源报表工具,提升报表开发效率。

weixin_28826521的博客 704

PyO3: python调用rust代码尝试

PyO3功能很强大,是python和rust之间交互桥梁。今天主要试验一下python端调用rust端编译的代码库。 说明:本文环境中在windos平台下。linux平台或其它平台请参看github上pyo3的说明。 一、rust 端 在rust端创建pyrust库文件: cargo new pyrust --lib 同时在lib.rs文件中,写入以下代码: 其中,#[pyfunction]是指写入rust方法,pyo3自动会转成python能调用的函数; #[pymodule]是指把这些函数放在一个mo

代码过客 5397

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2331

Rust FFI 编程 - 其它语言调用 Rust 代码 - Python

引言随着 Rust 生态的发展,一些 Rust 语言实现的优秀工具或基础协议库,受到越来越多的企业或开发者青睐。与此同时,使用 Rust 语言对已有产品和工具进行性能优化或安全性提升,以...

Rust语言学习交流 865

AUTOSAR E2E Protocol实战:Profile1到Profile5的配置差异与最佳实践

本文深入解析AUTOSAR E2E Protocol中Profile1到Profile5的核心配置差异与适用场景。针对经典CAN、CAN FD及以太网等不同总线,详细对比了计数器、CRC、DataID等关键参数,并结合实战代码与配置示例,为工程师根据功能安全等级、数据长度与带宽限制选择最佳Profile提供了清晰的选型路径与工程实践指南。

milk5的博客 944

【漏洞复现】用友NC-Cloud-反序列化-ResourceManagerServlet

NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构,技术先进、性能稳定、自主安全可控,支撑大中型以及超大型集团企业N层多site混合云部署方案,支持整个系统高可用、弹性扩展、双/多活,以及快速灾备恢复能力等。用友-NC-Cloud ResourceManagerServlet 接口存在反序列化漏洞,使得攻击者可以通过构造特定的请求远程执行恶意代码。此漏洞可能导致攻击者获取系统权限、执行任意命令,严重威胁系统的机密性和完整性。

漏洞复现 1366

161、Rust与Python互操作:性能与简易性的完美结合

本文介绍了Rust和Python互操作性的优势和应用,通过PyO3库实现Rust代码在Python中的运行。Rust的高性能和内存安全性可提升Python应用的性能和安全性,两者的结合适用于性能优化、扩展功能、跨平台开发等场景。案例研究中,我们通过一个图像处理库展示了Rust和Python互操作性的实际应用,Rust负责图像处理核心算法,Python提供用户友好的接口。

silenceallat的博客 7515

ECU诊断功能测试:从理论到实践

ECU诊断功能是指通过特定的诊断协议与ECU进行通信,以获取ECU的状态信息、故障码、数据流等,并执行特定的诊断操作。诊断功能的主要目的是帮助开发人员和维修人员快速定位和解决ECU中的问题,确保车辆的安全性和可靠性。UDS协议是ISO 14229标准的一部分,定义了一系列的诊断服务,如读取故障码、清除故障码、读取数据流等。UDS协议基于CAN(Controller Area Network)总线,具有较高的灵活性和扩展性。读取故障码是诊断功能中最基本的操作之一。通过读取故障码,可以快速定位ECU中的问题。

闲人编程的博客 1807

python调用rust_<转> 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一些性能问题,不过 Sentry 工程师分享的在关键模块上用另外一门语言 Rust 来代替 Python 的情况还是比较罕见,也在 Python 圈引发了热议,高可用架构小编将文章翻译转载如下。Sentry 是一个帮助在线业务进行监控及错误分析的云服务,它每月处理超过十亿次错误。我们已经能够扩展我们的大多数系统,但在过去几个月,...

weixin_39962285的博客 448

web渗透学习手册

依据多年的渗透测试项目经验及个人理解,对漏洞分类

渗透之路,攻防之间皆学问 1万+

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

使用Rust加速Python程序,让代码飞起来

大家好,作为一种解释型语言,Python在开发速度和灵活性方面具有明显的优势,但在性能方面却不如编译型语言如C++或Rust。对于性能要求苛刻的应用程序,如果纯粹使用Python编写可能会运行缓慢,影响用户体验。因此,如何利用Rust来加速Python程序的运行速度成为一个值得探讨的话题。本文将比较Python和Rust的性能,并介绍如何使用Rust加速Python程序。

csdn1561168266的博客 1564

永恒之蓝漏洞复现(ms17-010)

Metasploit Framework(MSF)是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程,被安全社区冠以“可以黑掉整个宇宙”之名。刚开始的Metasploit是采用Perl语言编写的,但是再后来的新版中,改成了用Ruby语言编写的了。在kali中,自带了Metasploit工具。

渗透之路,攻防之间皆学问 2万+

rust加速python

背景 之前都是在看C/Cpp,也在努力的学这两个语言。但是感觉太难了。语法太多了(主要还是人笨,学不过来)。 一直也在看rust,感觉rust写起来和python差不多优雅,而且写法和c++又是有点类似。 然后最近空闲时间就把《Rust程序设计语言》和《通过例子学Rust》两本书看完了。学到了不少新内容。 最近也发现一些新的包,比如一个叫polar包的,提供类pandas的功能,但是比pandas更快,这个包的底层是使用rust写的,并且python也能使用。那我就在想:“我能不能学习一下,看看怎么让py

yuanzhoulvpi的博客 1283

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

应用-使用Rust加速Python的最简单方法

然而,如果你只是想快速尝试Rust扩展,打包和集成样板代码可能会成为障碍:每增加一点摩擦都会阻碍你进行实验,看看Rust是否真的能带来帮助。的用武之地,它是一个库,使得独立的Rust文件可以轻松地在Python中导入(目前仅支持Linux和macOS)。当你编译Rust代码时,有不同的编译配置文件,它们以不同的方式编译。确实可以扩展到完整的Rust项目,但在这一点上,它的优势下降,切换到更明确的构建系统可能更好。这不是你最终打包库或应用程序时所需的,但我们的用例是原型设计,无论如何你都需要一个编译器。

liluo0815481的博客 1111

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Rust Python 加速指南(二)

要开始,我们必须确保我们的 Git 不会跟踪我们不希望上传的文件,并且我们的Cargo具有正确的依赖项,步骤 1。首先,我们可以从gitignore开始。如果你选择使用与我们在上一章中定义的相同的 GitHub 仓库,那么 Python 的所有文件已经定义在 GitHub 仓库根目录下的.gitignore文件中。如果不是这样,那么在你创建新的 GitHub 仓库时,我们必须在部分选择 Python 模板。无论如何,一旦我们在.gitignore文件中有 Python 的gitignore。

龙哥盟 1061

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

使用Rust加速Python项目教程

使用Rust加速Python项目教程 1. 项目介绍 项目概述 Speed-up-your-Python-with-Rust 是一个由Packt Publishing发布的开源项目,旨在帮助Python开发者通过使用Rust语言来加速他们的Python代码。Rust以其高性能和内存安全性著称,而Python则以其易用性和丰富的库生态系统受到欢迎。通过将Rust与Python结合,开发者可以在不改变...

gitblog_00024的博客 691

性能瓶颈终结者,如何用Rust为Python加速?

解决Python性能瓶颈,掌握Rust加速实战方法。通过Python Rust混合编程示例,展示在计算密集型场景中如何用Rust优化关键模块,提升执行效率数倍。结合PyO3工具实现无缝集成,兼顾开发效率与运行性能,值得收藏。

CodeNexus的博客 682

如何使用 Rust 加速 Python

本文翻译自,主要用于记录如何将 Rust 代码发布成 python 的包供 python 调用以提升性能。

weixin_50114401的博客 1112

Rust Python 加速指南(四)

在我们开始定义特性之前,我们必须概念化我们程序中定义行为的人的类型。病人:这个人没有任何临床技能,但对他们执行操作。护士:这个人拥有临床技能,但不能开具处方或诊断。护士执业医师:这个人拥有临床技能,可以开具处方但不能诊断。高级护士执业医师:这个人拥有临床技能,可以开具处方和诊断。医生:这个人拥有临床技能,可以开具处方和诊断。我们在这里可以看到,他们都是人类。因此,他们都能说话并介绍自己。所以,在我们的traits.rs文件中,我们可以创建一个Speak如果一个结构体实现了这个特性,它必须创建自己的。

龙哥盟 1111

使用rust加速python的tgz解压

最近需要把大量的tag解压,python的解压速度上出现了瓶颈。阅读了python的源码后发现较难优化,打算利用rust编译一个库文件供python调用。加速python解压。

dyq94310的博客 729

项目使用encode_使用rust加速python

以编辑距离为例,记录下rust加速python的过程先放完整代码地址WenmuZhou/rust_python新建一个工程cargo new rust_pythoncd rust_python编辑 Cargo.toml文件在文件中加上[lib]name = "edit_distence_rust" # 最终生存的so文件命名为 "lib{name}.so"crate-type = ["dylib"...

weixin_39915367的博客 157

Rust Python 加速指南(一)

在本章中,我们学习了 Cargo 的基础知识。通过 Cargo,我们成功地构建了基本的应用程序,对它们进行了文档化,编译并运行了它们。看到这种实现是多么干净和简单,很明显为什么 Rust 是最受欢迎的语言之一。通过一个文件中的几行代码管理所有功能、文档和依赖项,加快了整个过程。结合严格的、有帮助的编译器,使得 Rust 在管理复杂项目时成为不二之选。我们通过将模块包装在易于使用的接口中,并通过命令行与用户的输入交互来管理复杂性。现在,正如你所站立的此刻,你可以开始编写 Rust 代码来解决一系列问题。

龙哥盟 997

GSEApy源码解析:Rust加速背后的算法原理

GSEApy是一款基于Python的基因集富集分析工具,通过引入Rust编写的核心算法模块,实现了基因富集分析的高效计算。本文将深入解析GSEApy中Rust加速模块的实现原理,揭示其如何在保持算法准确性的同时大幅提升运算性能。 ## 基因集富集分析的核心算法 基因集富集分析(GSEA)是生物信息学中研究基因功能富集的重要方法。其核心原理是通过计算基因集的富集分数(ES)来评估特定功能基因集在

gitblog_00125的博客 499
上一篇: 爬虫进阶实战(selinum爬取淘宝商品类目)
下一篇: 提高Django查询速度的9种方法
Python_P叔
博客等级 码龄3年 5452粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值