目录
《Python高效编程------基于Rust语言》全书速览
前言
随着互联网的快速发展和应用程序的广泛使用,编程语言的发展也是对应的,尤其是一些好用的编程语言让广大程序员"爱不释手",就拿倍受欢迎的python语言来讲,Python是一种简洁、易学且功能强大的编程语言,然而在某些情况下,它可能因为执行效率的限制而受到挑战。为了克服这一问题,开发者们开始探索将Python与其他高性能语言结合的方法,这是一个非常不错的策略。那么本文就来分享介绍一种基于Rust语言的方法,通过与Python的集成,提升Python程序的执行效率和性能。
关于Rust语言
先来了解一下Rust语言,其实Rust是一种系统级编程语言,具有内存安全、并发性和高性能等特点,与Python相比,Rust更接近底层,可以直接与硬件进行交互,并提供了更好的性能和并发处理能力。
Rust与Python的集成
众所周知,由于Rust具有良好的与其他语言集成的能力,我们可以通过以下方法将Rust与Python结合起来,以提升Python程序的性能,具体如下所示:
- Rust扩展模块:Rust提供了在Python中编写扩展模块的功能,通过使用Rust语言编写关键部分的模块,然后将其与Python代码绑定,可以在不影响现有Python代码的情况下提升性能,这样可以利用Rust的高效性能和并发性能优势,加速Python程序的关键部分。
- FFI(Foreign Function Interface):Rust支持与其他语言进行高效的交互,通过使用FFI机制,我们可以将Rust代码编译为动态链接库或共享库,并在Python中调用这些库。这使得我们可以使用Rust实现性能敏感的算法或计算密集型任务,并通过Python进行高级逻辑的处理和控制。
- PyO3和Cython:PyO3是一个Rust库,用于构建Python扩展模块,它提供了一组工具和宏,使得编写Python扩展模块更加容易和高效,类似地,Cython是一个用于编写Python扩展的工具,它可以将Python代码转换为C语言,并与Rust集成以提高性能。
使用案例
下面再来分享一下具体的几个使用Rust与Python集成的案例,方便读者借鉴和学习,如下所示:
- 数据处理和科学计算:在大规模数据处理和科学计算领域,Rust可以用于编写高性能的算法和数据处理任务,而Python可以用于高级数据分析和结果可视化,通过将两者结合,可以实现高效的数据处理和分析流程。
- Web开发:Rust在Web开发领域也表现出色,我们可以使用Rust编写高性能的Web服务器或API,并通过Python的框架(如Django或Flask)进行高级的业务逻辑处理。
- 并行计算:Rust的并发性能在处理大规模并行计算任务时非常有优势,通过与Python的集成,我们可以利用Rust的并发性能来加速Python程序的并行计算部分。
关于《Python高效编程------基于Rust语言》
接下来给大家推荐一本关于Python的书籍,这是一本想要入门Python的开发者离不开的干货图书,一经上市就登上了当当"计算机与互联网"图书排行榜前列。本书从Python基础到高效实战,助你在Python开发领域取得成功!另外,关注本文博主,点赞+收藏本文,且在本文评论区评论"我要入门Python开发",将选取三名幸运读者送出纸质版《Python高效编程------基于Rust语言》一本,截止时间:2024.03.18 。入手《Python高效编程------基于Rust语言》传送门:《Python高效编程------基于Rust语言》([美]麦克斯韦尔·弗立顿 著 付岩 译)【简介_书评_在线阅读】 - 当当图书或者《Python高效编程------基于Rust语言》([美]麦克斯韦尔·弗立顿)【摘要 书评 试读】- 京东图书,个人觉得这本书非常的不错,是一本不可多得的好书,值得拥有去学习。
编辑推荐
Rust是一门令人兴奋的新语言。它为开发人员提供了没有垃圾收集机制的内存安全,从而带来了快速的运行和低内存占用。但是,用Rust重写一切可能是昂贵和有风险的,因为Rust中可能没有对要解决的问题的包支持。这就是Python绑定和pip的用武之地。本书将使开发人员能够用Rust编写可以使用pip安装的模块,这样就能够在需要的时候注入Rust,而不需要承担重写整个系统的风险和工作量。这种方法使开发人员能够在Python项目中尝试和使用Rust。
内容简介
《Python高效编程------基于Rust语言》详细阐述了基于Rust语言的Python高效编程,主要包括从Python的角度认识Rust、使用Rust构建代码、理解并发性、在Python中构建pip模块、为pip模块创建Rust接口、在Rust中使用Python对象、在Rust中使用Python模块、在Rust中构建端到端Python模块、构建Python Flask应用程序、将Rust注入Python Flask应用程序、集成Rust的**实践等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。
作者简介
麦克斯韦尔·弗立顿是一名软件工程师,为开源的财务损失建模基金会(financial loss modeling foundation)OasisLMF工作。2011年,Maxwell取得了英国林肯大学的护理学理学士学位。在医院急诊科工作12小时的同时,Maxwell还获得了英国开放大学的物理学学位,然后又迈向了另一个里程碑,获得了伦敦大学医学院的物理学和工程学研究生文凭。他曾参与过许多项目,如为德国政府提供医疗模拟软件,并在伦敦帝国学院指导计算医学学生。他有在金融科技领域工作的经验,并曾经为Monolith AI公司服务过。
图书目录
第1篇 了解Rust
第1章 从Python的角度认识Rust 3
1.1 技术要求 3
1.2 了解Python和Rust之间的区别 4
1.2.1 结合使用Python与Rust的原因 4
1.2.2 在Rust中传递字符串 7
1.2.3 在Rust中调整浮点数和整数的大小 9
1.2.4 在Rust的向量和数组中管理数据 11
1.2.5 用哈希映射取代字典 13
1.2.6 Rust中的错误处理 16
1.3 了解变量所有权 19
1.3.1 复制 20
1.3.2 移动 20
1.3.3 不可变借用 21
1.3.4 可变借用 23
1.4 跟踪作用域和生命周期 23
1.5 构建结构体而不是对象 27
1.6 使用宏而不是装饰器进行元编程 31
1.7 小结 34
1.8 问题 34
1.9 答案 35
1.10 延伸阅读 35
第2章 使用Rust构建代码 37
2.1 技术要求 37
2.2 用crate和Cargo代替pip管理代码 38
2.3 在多个文件和模块上构建代码 45
2.4 构建模块接口 49
2.4.1 开发一个简单的股票交易程序 51
2.4.2 写代码时编写文档的好处 57
2.5 与环境交互 58
2.6 小结 60
2.7 问题 61
2.8 答案 61
2.9 延伸阅读 62
第3章 理解并发性 63
3.1 技术要求 63
3.2 并发性介绍 63
3.2.1 线程 64
3.2.2 进程 65
3.3 使用线程的基本异步编程 67
3.3.1 在Python中使用线程 68
3.3.2 在Rust中使用线程 69
3.4 运行多个进程 74
3.4.1 在Python中使用多进程池 74
3.4.2 在Rust中使用多线程池 78
3.4.3 在Rust中使用多进程池 81
3.5 安全地自定义线程和进程 85
3.5.1 阿姆达尔定律 85
3.5.2 死锁 86
3.5.3 竞争条件 88
3.6 小结 88
3.7 问题 89
3.8 答案 89
3.9 延伸阅读 90
第2篇 融合Rust和Python
第4章 在Python中构建pip模块 95
4.1 技术要求 95
4.2 为Python pip模块配置设置工具 96
4.2.1 创建GitHub存储库 96
4.2.2 定义基本参数 99
4.2.3 定义自述文件 100
4.2.4 定义基本模块 101
4.3 在pip模块中打包Python代码 102
4.3.1 构建斐波那契计算代码 103
4.3.2 创建命令行接口 105
4.3.3 构建单元测试 107
4.4 配置持续集成 113
4.4.1 手动部署到PyPI 113
4.4.2 管理依赖项 115
4.4.3 为Python设置类型检查 116
4.4.4 使用GitHub Actions设置和运行测试及类型检查 117
4.4.5 为pip包创建自动版本控制 121
4.4.6 使用GitHub Actions部署到PyPI 124
4.5 小结 126
4.6 问题 127
4.7 答案 128
4.8 延伸阅读 128
第5章 为pip模块创建Rust接口 129
5.1 技术要求 129
5.2 使用pip打包Rust代码 130
5.2.1 定义gitignore和Cargo 130
5.2.2 配置Python设置过程 132
5.2.3 安装Rust库 134
5.3 使用PyO3 crate构建Rust接口 135
5.3.1 构建计算斐波那契数列的Rust代码 136
5.3.2 创建命令行工具 138
5.3.3 创建适配器 140
5.3.4 使用单例设计模式构建适配器接口 142
5.3.5 在Python控制台中测试适配器接口 146
5.4 为Rust包构建测试 148
5.5 比较Python、Rust和Numba的速度 151
5.6 小结 153
5.7 问题 154
5.8 答案 154
5.9 延伸阅读 155
第6章 在Rust中使用Python对象 157
6.1 技术要求 157
6.2 将复杂的Python对象传递到Rust中 157
6.2.1 更新setup.py文件以支持.yml加载 158
6.2.2 定义.yml加载命令 159
6.2.3 处理来自Python字典的数据 160
6.2.4 从配置文件中提取数据 164
6.2.5 将Python字典返回到Python系统 165
6.3 检查和使用自定义Python对象 167
6.3.1 为Rust接口创建一个对象 167
6.3.2 在Rust中获取Python GIL 168
6.3.3 向新创建的PyDict结构体添加数据 170
6.3.4 设置自定义对象的特性 172
6.4 在Rust中构建自定义Python对象 173
6.4.1 定义具有所需特性的Python类 174
6.4.2 定义类静态方法处理输入 174
6.4.3 定义类构造函数 175
6.4.4 包装并测试模块 176
6.5 小结 179
6.6 问题 180
6.7 答案 180
6.8 延伸阅读 181
第7章 在Rust中使用Python模块 183
7.1 技术要求 183
7.2 认识NumPy 183
7.2.1 在NumPy中执行向量相加操作 184
7.2.2 在纯Python中执行向量相加操作 185
7.2.3 在Rust中使用NumPy执行向量相加操作 186
7.3 在NumPy中构建模型 190
7.3.1 定义模型 190
7.3.2 构建一个执行模型的Python对象 192
7.4 在Rust中使用NumPy和其他Python模块 195
7.5 在Rust中重建NumPy模型 198
7.5.1 构建get_weight_matrix和invert_get_weight_matrix函数 200
7.5.2 构建get_parameters、get_times和get_input_vector函数 201
7.5.3 构建calculate_parameters和calculate_times函数 202
7.5.4 将计算函数添加到Python绑定 203
7.5.5 将NumPy依赖项添加到setup.py文件 204
7.5.6 构建Python接口 204
7.6 小结 205
7.7 问题 206
7.8 答案 206
7.9 延伸阅读 207
第8章 在Rust中构建端到端Python模块 209
8.1 技术要求 209
8.2 分解一个灾难建模问题 209
8.3 将端到端解决方案构建为一个包 214
8.3.1 构建灾难足迹合并流程 215
8.3.2 构建灾难脆弱性合并流程 217
8.3.3 在Rust中构建Python接口 221
8.3.4 在Python中构建接口 223
8.3.5 构建包安装说明 223
8.4 使用和测试包 225
8.4.1 使用Pandas构建Python构造模型 226
8.4.2 构建随机事件ID生成器函数 227
8.4.3 为Python和Rust实现计时 228
8.5 小结 230
8.6 延伸阅读 230
第3篇 将Rust注入Web应用程序
第9章 构建Python Flask应用程序 233
9.1 技术要求 233
9.2 构建一个基本的Flask应用程序 234
9.2.1 为应用程序构建一个入口点 235
9.2.2 构建斐波那契数计算模块 235
9.2.3 为应用程序构建Docker镜像 237
9.2.4 构建NGINX服务 239
9.2.5 连接并运行NGINX服务 241
9.3 定义数据访问层 243
9.3.1 在docker-compose中定义PostgreSQL数据库 244
9.3.2 构建配置加载系统 245
9.3.3 构建数据访问层 247
9.3.4 搭建应用程序数据库迁移系统 249
9.3.5 建立数据库模型 252
9.3.6 将数据库访问层应用于fib计算视图 253
9.4 构建消息总线 255
9.4.1 为Flask构建一个Celery代理 256
9.4.2 为Celery构建一个斐波那契计算任务 258
9.4.3 用Celery更新计算视图 258
9.4.4 在Docker中定义Celery服务 259
9.5 小结 262
9.6 问题 263
9.7 答案 263
9.8 延伸阅读 264
第10章 将Rust注入Python Flask应用程序 265
10.1 技术要求 265
10.2 将Rust融合到Flask和Celery中 266
10.2.1 定义对Rust斐波那契数计算包的依赖 266
10.2.2 用Rust构建计算模型 266
10.2.3 使用Rust创建计算视图 269
10.2.4 将Rust插入Celery任务中 270
10.3 使用Rust部署Flask和Celery 271
10.4 使用私有GitHub存储库进行部署 273
10.4.1 构建一个协调整个过程的Bash脚本 275
10.4.2 在Dockerfile中重新配置Rust斐波那契数列计算包的安装 275
10.5 将Rust与数据访问相结合 277
10.5.1 设置数据库克隆包 277
10.5.2 设置diesel环境 279
10.5.3 自动生成和配置数据库模型和模式 280
10.5.4 在Rust中定义数据库连接 282
10.5.5 创建一个获取并返回所有斐波那契记录的Rust函数 282
10.6 在Flask中部署Rust nightly包 285
10.7 小结 286
10.8 问题 286
10.9 答案 287
10.10 延伸阅读 287
第11章 集成Rust的实践 289
11.1 技术要求 289
11.2 通过将数据传入和传出Rust来保持Rust实现的简单性 290
11.2.1 构建一个Python脚本来制定用于计算的数字的格式 290
11.2.2 构建一个接受数字进行计算并返回结果的Rust文件 291
11.2.3 构建一个接受计算出的数字并将其打印出来的Python脚本 292
11.3 通过对象给接口一种原生的感觉 294
11.4 使用trait而不是对象 298
11.4.1 定义trait 300
11.4.2 通过trait定义结构体的行为 301
11.4.3 通过函数传递trait 303
11.4.4 存储具有共同trait的结构体 305
11.4.5 在main.rs文件中运行程序 305
11.5 通过Rayon保持数据并行的简单性 308
11.6 小结 310
11.7 延伸阅读 310
·XIV·
Python高效编程---基于Rust语言
·XV·
目 录
书中前言/序言
Rust是一门令人兴奋的新语言。它为开发人员提供了没有垃圾收集机制的内存安全,从而带来了快速的运行和低内存占用。但是,用Rust重写一切可能是昂贵和有风险的,因为Rust中可能没有对要解决的问题的包支持。这就是Python绑定和pip的用武之地。本书将使开发人员能够用Rust编写可以使用pip安装的模块,这样就能够在需要的时候注入Rust,而不需要承担重写整个系统的风险和工作量。这种方法使开发人员能够在Python项目中尝试和使用Rust。
本书读者
想用Rust加快代码运行速度的Python开发人员,或者想在不承担太多风险或工作量的情况下尝试Rust的开发人员,都会从本书中受益。读者不需要有Rust的背景。本书介绍了Rust,并使用Python实例让读者快速掌握Rust。
内容介绍
本书分为3篇,共11章。具体内容介绍如下。
* 第1篇为"了解Rust",包括第1~3章。
> 第1章为"从Python的角度认识Rust",介绍了有关Rust的基础知识,重点阐释了Python和Rust之间的区别,以帮助Python开发人员快速了解 Rust,并给出了相关的Python实例,以帮助开发人员掌握Rust概念。
> 第2章为"使用Rust构建代码",解释了如何在多个页面上构造Rust程序,并使用包管理工具来组织和安装依赖项。
> 第3章为"理解并发性",介绍了线程和进程的概念,演示了如何在Rust中运行多线程和多进程。该章还介绍了Python中的并发性,以帮助开发人员了解其中的差异。
* 第2篇为"融合Rust和Python",包括第4~8章。
> 第4章为"在Python中构建pip模块",讨论了如何构建可以使用pip安装的Python包,还演示了如何在GitHub上托管软件包,以及配置持续集成等。
> 第5章为"为pip模块创建Rust接口",介绍了如何将Rust代码注入pip模块,并使用Rust设置工具来编译和使用Python中的Rust代码。
> 第6章为"在Rust中使用Python对象",考虑了另一个方向上的兼容,即在Rust中接受和处理Python数据结构并与之交互。该章还讨论了如何在Rust中创建自定义Python对象。
> 第7章为"在Rust中使用Python模块",介绍了如何在Rust代码中使用诸如NumPy之类的Python模块。
> 第8章为"在Rust中构建端到端Python模块",将所有已经讨论的内容打包成一个用Rust编写的功能齐全的Python包。这个包拥有Python接口和命令行功能,可以接受YAML文件进行配置。
* 第3篇为"将Rust注入Web应用程序",包括第9~11章。
> 第9章为"构建Python Flask应用程序",构建了一个带有PostgreSQL数据库、NGINX负载均衡器和Celery工作进程的Python Flask应用程序,以使Rust技能更加实用。所有项目都被包裹在Docker中,为将Rust注入Web应用程序打下基础。
> 第10章为"将Rust注入Python Flask应用程序",讨论了如何利用第9章中构建的Web应用,将Rust模块注入Celery工作进程和Flask应用程序的Docker容器。该章还印证了已经应用的迁移,以自动生成数据库的模式,这样Rust代码就可以直接与数据库连接。此外,该章还介绍了如何使用来自私有GitHub存储库的Rust包。
> 第11章为"集成Rust的实践",给出了一些提示,说明在为Python编写Rust代码时如何避免常见的错误。
充分利用本书
建议读者了解Python并能适应面向对象编程。本书将涉及一些高级主题,如元类,但不是必不可少的。Rust编程、Python Web应用程序和使用pip安装的Python模块等都在 本书中有所涉及。
本书涵盖的软件和操作系统需求如表P.1所示。
表P.1 本书涵盖的软件和操作系统需求
本书涵盖的软件 操作系统需求 Python 3 Windows、macOS或Linux Rust Windows、macOS或Linux Docker Windows、macOS或Linux PyO3 Windows、macOS或Linux Redis Windows、macOS或Linux PostgreSQL Windows、macOS或Linux 建议读者自己输入代码或从本书的GitHub存储库访问代码(下文将提供链接) ,以避免与复制和粘贴代码相关的任何潜在错误。
下载示例代码文件
本书随附的代码可以在GitHub存储库中找到,其网址如下:
如果代码有更新,也将在该GitHub存储库中更新。
下载彩色图像
本书提供了一个PDF文件,其中包含本书中使用的屏幕截图/图表的彩色图像。可通过以下地址下载。
https://static.packt-cdn.com/downloads/9781801811446_ColorImages.pdf
本书约定
本书中使用了许多文本约定。
(1)表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄等的段落示例如下:
2019年,芯片巨头英伟达(NVIDIA)公司的联合创始人兼首席执行官黄仁勋(Jensen Huang)表示,随着芯片组件越来越接近单个原子的大小,它变得越来越难以跟上摩尔定律的步伐,因此可以宣布摩尔定律已经死亡。有关详细信息,可访问:
moores-law-is-dead-nvidias-ceo-jensen-huang-says-at-ces-2019/
(2)有关代码块的设置如下所示。
use std::error::Error;
use std::fs::File;
use csv;
use super::structs::FootPrint;
(3)任何命令行输入或输出都采用如下所示的粗体代码形式。
pip install git https://github.com/maxwellflitton/flitton-fib-rs@main
(4)术语或重要单词采用中英文对照形式,在括号内保留其英文原文。示例如下:
当代码编译时,它将为栈(stack)中的不同变量分配内存;当代码运行时,它会将数据存储在堆(heap)中。
(5)界面词汇或专有名词将保留英文原文,在括号内添加其中文翻译。示例如下:
首先需要将PyPI账户的用户名和密码存储在GitHub存储库的Secrets(秘密)部分。这可以通过单击Settings(设置)选项卡,然后选择左侧边栏上的Secrets(秘密)选项来完成。
(6)本书使用了以下两个图标。
表示警告或重要的注意事项。
表示提示或小技巧。
·VIII·
Python高效编程---基于Rust语言
·VII·
前 言
《Python高效编程------基于Rust语言》全书速览
结束语
通过本文的分享讲解,将Python与Rust语言结合,我们可以充分发挥两者的优势,而且借助Rust的高性能和并发处理能力,我们可以加速Python程序的关键部分,从而在处理大规模数据、科学计算、Web开发和并行计算等领域取得更好的性能和效果。作为开发者,只有不断地去实践和学习,才能更好的解决生产上遇到的问题,而且对于编程语言的了解和学习也是如此。只有通过深入研究和实践,我们可以掌握Python与Rust的集成技术,开发出高效的Python应用程序。