书籍详情
Python高效编程:基于Rust语言
作者:[美]麦克斯韦尔·弗立顿 著,付岩 译
出版社:清华大学出版社
出版时间:2023-03-01
ISBN:9787302630517
定价:¥119.00
购买这本书可以去
内容简介
《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·
目 录
第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·
目 录
猜您喜欢