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

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

1.Python和Rust性能比较

下面进行案例实验,比较Python和Rust在计算50次迭代的30位斐波那契数的性能上的表现。

1.1 Python版本代码

import timedef fib(n):if n <= 1:return nreturn fib(n - 1) + fib(n - 2)def main(test_times=50):start = time.time()for _ in range(test_times):fib(30)print(f"Total time spent: {time.time() - start} s")main()
# Total time spent: 7.306154012680054 s

结果超过7秒钟,对于大多数应用而言都不太理想。

1.2 Rust版本代码

"惊人地快"——这就是Rust的官方网站描述其性能的方式,下面是在Rust中计算同样的斐波那契数。

use std::time;fn fib(n: i32) -> u64 {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!("Total time spent: {:?}", start.elapsed())
}
// Total time spent: 179.774166ms

结果显示,Rust版本的程序运行时间为179.774166毫秒,比Python版本快了近40倍。虽然Rust在性能上有着明显的优势,但对于Python开发人员来说,Rust的语法并不优雅,学习曲线也比较陡峭。

如果能够在大型项目中使用Python作为主要语言,同时在需要提高性能的部分使用Rust来加速,那将会是一种非常棒的解决方案。

2.用Rust重写缓慢的Python函数

有几种方法可以将低性能的Python函数重写为Rust,其中一种流行的方法是使用PyO3,这是一个关于Rust绑定Python解释器的开源工具。

首先,需要安装一个名为maturin的模块:

pip install maturin

然后,通过以下命令初始化Rust所需的文件:

maturin init

如下面的截图所示,有几种方法可以执行Rust绑定,在此选择PyO3。

图片

这一步将生成Rust绑定所需的文件和文件夹,现在需要做的是修改两个重要文件:Cargo.tomllib.rsCargo.toml是一个包清单,它以TOML格式编写,包含编译包所需的元数据。

本示例需要将相对名称更改为rustFib,并保留其他设置的默认值。

[package]
name = "rustFib"
version = "0.1.0"
edition = "2021"[lib]
name = "rustFib"
crate-type = ["cdylib"][dependencies]
pyo3 = "0.19.0"

可以在lib.rs文件中编写Rust代码,并将其作为Python函数的替代品来提高程序的性能。

use pyo3::prelude::*;/// Rust中实现的Python函数
#[pyfunction]
fn fib(n: i32) -> u64 {match n {1 | 2 => 1,_ => fib(n - 1) + fib(n - 2)}
}/// 将其作为Python模块。
#[pymodule]
fn rustFib(_py: Python, m: &PyModule) -> PyResult<()> {m.add_function(wrap_pyfunction!(fib, m)?)?;Ok(())
}

最后执行命令来编译Rust代码:

maturin develop

成功用Rust构建了名为rustFib的Python包之后,在Python中使用,与原始Rust程序的速度进行比较。

import time
from rustFib import fibdef main(test_times=50):start = time.time()for _ in range(test_times):fib(30)print(f"Total time spent: {time.time() - start} s")main()
# Total time spent: 0.17684102058410645 s

如上面的代码所示,总共花费的时间现在是0.176 ms,这就使Python程序像Rust一样快速,大大提高了使用性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2815150.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

揭秘:MyBatis初恋的甜蜜!

&#x1f496;MyBatis的爱情故事&#x1f496; &#x1f339; 第一次遇见官方文档概述为什么需要MyBatis基本介绍MyBatis工作原理学习主线 &#x1f388; 第一次约会需求说明代码实现日志输出-查看SQL课后练习 &#x1f48c; 我们的情书MyBatis整体架构分析搭建MyBatis底层机制…

自由生成各种尺寸大小的占位图片:解决设计与开发中的图片占位问题

title: 自由生成各种尺寸大小的占位图片&#xff1a;解决设计与开发中的图片占位问题 date: 2024/2/28 20:29:11 updated: 2024/2/28 20:29:11 tags: 占位图片尺寸自定义设计效率用户体验响应式设计开发工具测试辅助 在设计与开发的过程中&#xff0c;经常需要使用占位图片来填…

Visio使用笔记

记录一下需要的常用操作 圆角矩形的弧度调整 如果一开始创建的是圆角矩形&#xff0c;可以菜单栏先改为矩形 取消箭头的对齐吸附 alt F9&#xff0c;取消勾选 忘记快捷键&#xff0c;可以菜单栏找到视图&#xff0c;点击视觉帮助右下角的小箭头&#xff0c;引出上面的界面…

leetcode:134.加油站

解题思路&#xff1a;需要注意开始时的编号&#xff0c;有的可以走一圈&#xff0c;有的走不了 模拟过程&#xff1a;for循环主要是用来模拟线性的过程&#xff0c;而在这里它是环状的&#xff1b; 可以用暴力解法&#xff0c;但是在这里我用贪心来解决。 常见疑惑&#xff1…

三、软件-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息&#xff0c;自动进行数据处理和计算&#xff0c;并输出结果信息的机器系统。 冯诺依曼体系计算机结构&#xff1a; 1、计算机硬件组成 冯诺依曼计算机结构将…

我的天道观【其十】文明一直向前的吗?

近百年我们文明的科技发展迅速&#xff0c;变局剧烈&#xff0c; 但却给全人类一个错觉——仿佛文明一定是不断向前发展的。 实际上&#xff0c;文明是很容易断层的&#xff0c;越是复杂的文明&#xff0c;越容易分崩离析&#xff0c;出现断层甚至灭亡。 唯一减少这样冲突可…

等保2.0高风险项全解析:判定标准与应对方法

引言 所谓高风险项&#xff0c;就是等保测评时可以一票否决的整改项&#xff0c;如果不改&#xff0c;无论你多少分都会被定为不合格。全文共58页&#xff0c;写得比较细了&#xff0c;但是想到大家基本不会有耐心去仔细看的&#xff08;凭直觉&#xff09;。这几天挑里边相对…

springboot003图书个性化推荐系统的设计与实现(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的图书个…

前端基础面试题(二)

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录下... 1. offsetHeight scrollHeight clientHeight 区别 计算规则&#xff1a; offsetHeight offsetWidth : border padding content clientHeight clientWidth: padding content scrollHeight…

智慧公厕:打造智慧城市环境卫生新标杆

随着科技的不断发展和城市化进程的加速推进&#xff0c;智慧城市建设已经成为各地政府和企业关注的焦点。而作为智慧城市环境卫生管理的基础设施&#xff0c;智慧公厕的建设和发展也备受重视&#xff0c;被誉为智慧城市的新标杆。本文以智慧公厕源头厂家广州中期科技有限公司&a…

[计算机网络]--MAC/ARP/DNS协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、认识以…

Win11更新偷偷塞入Win7功能,评分让微软难受

如果将 Win11 上架到 Steam 提供评论打分&#xff0c;那么 Win11 会和很多有争议的游戏一样&#xff1a;褒贬不一。 许多功能是吸引人的&#xff0c;但微软总会在什么时候突然给你一击。 前有 VBS 影响性能、谜之卡顿&#xff0c;后有各种广告、自动安装微软电脑管家。 以及我…

azure devops工具实践分析

对azure devops此工具的功能深挖&#xff0c;结合jira的使用经验的分析 1、在backlog的功能描述&#xff0c;可理解为需求项&#xff0c;这里包括了bug&#xff0c;从开发的角度修复bug也是个工作项&#xff0c;所以需求的范围是真正的需求&#xff08;开发接收到的已经确认的…

【蓝桥杯】快读|min和max值的设置|小明和完美序列|​顺子日期​|星期计算|山

目录 一、输入的三种方式 1.最常见的Scanner的输入方法 2.数据多的时候常用BufferedReader快读 3.较麻烦的StreamTokenizer快读&#xff08;用的不多&#xff09; StreamTokenizer常见错误&#xff1a; 二、min和max值的设置 三、妮妮的翻转游戏 四、小明和完美序列 五…

基于java SSM springboot+redis网上水果超市商城设计和实现以及文档

基于java SSM springbootredis网上水果超市商城设计和实现以及文档 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 …

华为OD机试真题-最长子字符串的长度(一)-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; 思路转化&#xff1a;求出o字母出现偶次&#xff08;o的索引&#xff09;&#xff1b;环形–双倍字母&#xff1b; 方法1&#xff1a;循环变量双倍字母&#xff08;保证环线&#xff09;&#xff0c;记录最大偶次&#xff0c;如果是&a…

Soul App与众多知名品牌展开合作,广告商业化提速显著

作为一家在2016年创立的兴趣社交应用,Soul App一直以其独特的数字头像和标签AI匹配的社交方式脱颖而出。其独特之处在于,用户在这个平台上并不被鼓励上传真实的人像照片,而是被要求使用数字头像进行社交。这种设计受到了年轻用户喜爱,成为其用户增长的原因之一。而创始人张璐在…

闲扯B-Tree和B+Tree的异同

我们今天要聊一个比较硬的话题&#xff1a; 一个 / 传说中的 / 惊天动地的 / 牛逼的 / 大家都听说过的 / 却又很少实际深入接触到的 / 但又基本每天都在使用的数据结构。&#xff08;大家注意看上一句话的定语&#xff09; 我记得我最先接触B树是在大学学数据结构的时候&#x…

探索IP地址定位工具:解读IP数据云的功能与优势

在当今数字化时代&#xff0c;IP地址定位工具成为了许多领域中不可或缺的技术支持&#xff0c;为网络安全、地理定位服务和个性化推荐等提供了重要数据支持。其中&#xff0c;IP数据云作为一种领先的IP地址定位工具&#xff0c;具有一系列功能和优势&#xff0c;本文将对其进行…

代码随想录算法训练营29期|day64 任务以及具体安排

第十章 单调栈part03 有了之前单调栈的铺垫&#xff0c;这道题目就不难了。 84.柱状图中最大的矩形class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st new Stack<Integer>();// 数组扩容&#xff0c;在头和尾各加入一个元素int [] ne…