新書推薦:
《
世界前沿技术发展报告2024
》
售價:NT$
857.0
《
可转债——新手理财的极简工具
》
售價:NT$
296.0
《
新加坡教育:神话与现实
》
售價:NT$
439.0
《
“口袋中的世界史”第一辑·冷战中的危机事件
》
售價:NT$
1326.0
《
绝美的奥伦堡蕾丝披肩编织
》
售價:NT$
806.0
《
狂飙年代:18世纪俄国的新文化和旧文化(第二卷)
》
售價:NT$
806.0
《
万有引力书系 纳粹亿万富翁 德国财富家族的黑暗历史
》
售價:NT$
500.0
《
中国常见植物野外识别手册:青海册
》
售價:NT$
347.0
編輯推薦:
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存储库中找到,其网址如下:
https://github.com/PacktPublishing/Speed-up-your-Python-with-Rust
如果代码有更新,也将在该GitHub存储库中更新。
下载彩色图像
本书提供了一个PDF文件,其中包含本书中使用的屏幕截图/图表的彩色图像。可通过以下地址下载。
https://static.packt-cdn.com/downloads/9781801811446_ColorImages.pdf
本书约定
本书中使用了许多文本约定。
(1)表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄等的段落示例如下:
2019年,芯片巨头英伟达(NVIDIA)公司的联合创始人兼首席执行官黄仁勋(Jensen Huang)表示,随着芯片组件越来越接近单个原子的大小,它变得越来越难以跟上摩尔定律的步伐,因此可以宣布摩尔定律已经死亡。有关详细信息,可访问:
https://www.cnet.com/news/
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·
前 言