《Python高效編程基于Rust語言》詳細(xì)闡述了基于Rust語言的Python高效編程,主要包括從Python的角度認(rèn)識(shí)Rust、使用Rust構(gòu)建代碼、理解并發(fā)性、在Python中構(gòu)建pip模塊、為pip模塊創(chuàng)建Rust接口、在Rust中使用Python對(duì)象、在Rust中使用Python模塊、在Rust中構(gòu)建端到端Python模塊、構(gòu)建Python Flask應(yīng)用程序、將Rust注入Python Flask應(yīng)用程序、集成Rust的**實(shí)踐等內(nèi)容。此外,本書還提供了相應(yīng)的示例、代碼,以幫助讀者進(jìn)一步理解相關(guān)方案的實(shí)現(xiàn)過程。 本書適合作為高等院校計(jì)算機(jī)及相關(guān)專業(yè)的教材和教學(xué)參考書,也可作為相關(guān)開發(fā)人員的自學(xué)教材和參考手冊(cè)。
Rust是一門令人興奮的新語言。它為開發(fā)人員提供了沒有垃圾收集機(jī)制的內(nèi)存安全,從而帶來了快速的運(yùn)行和低內(nèi)存占用。但是,用Rust重寫一切可能是昂貴和有風(fēng)險(xiǎn)的,因?yàn)镽ust中可能沒有對(duì)要解決的問題的包支持。這就是Python綁定和pip的用武之地。本書將使開發(fā)人員能夠用Rust編寫可以使用pip安裝的模塊,這樣就能夠在需要的時(shí)候注入Rust,而不需要承擔(dān)重寫整個(gè)系統(tǒng)的風(fēng)險(xiǎn)和工作量。這種方法使開發(fā)人員能夠在Python項(xiàng)目中嘗試和使用Rust。
Rust是一門令人興奮的新語言。它為開發(fā)人員提供了沒有垃圾收集機(jī)制的內(nèi)存安全,從而帶來了快速的運(yùn)行和低內(nèi)存占用。但是,用Rust重寫一切可能是昂貴和有風(fēng)險(xiǎn)的,因?yàn)镽ust中可能沒有對(duì)要解決的問題的包支持。這就是Python綁定和pip的用武之地。本書將使開發(fā)人員能夠用Rust編寫可以使用pip安裝的模塊,這樣就能夠在需要的時(shí)候注入Rust,而不需要承擔(dān)重寫整個(gè)系統(tǒng)的風(fēng)險(xiǎn)和工作量。這種方法使開發(fā)人員能夠在Python項(xiàng)目中嘗試和使用Rust。
本書讀者
想用Rust加快代碼運(yùn)行速度的Python開發(fā)人員,或者想在不承擔(dān)太多風(fēng)險(xiǎn)或工作量的情況下嘗試Rust的開發(fā)人員,都會(huì)從本書中受益。讀者不需要有Rust的背景。本書介紹了Rust,并使用Python實(shí)例讓讀者快速掌握Rust。
內(nèi)容介紹
本書分為3篇,共11章。具體內(nèi)容介紹如下。
* 第1篇為了解Rust,包括第1~3章。
> 第1章為從Python的角度認(rèn)識(shí)Rust,介紹了有關(guān)Rust的基礎(chǔ)知識(shí),重點(diǎn)闡釋了Python和Rust之間的區(qū)別,以幫助Python開發(fā)人員快速了解 Rust,并給出了相關(guān)的Python實(shí)例,以幫助開發(fā)人員掌握Rust概念。
> 第2章為使用Rust構(gòu)建代碼,解釋了如何在多個(gè)頁面上構(gòu)造Rust程序,并使用包管理工具來組織和安裝依賴項(xiàng)。
> 第3章為理解并發(fā)性,介紹了線程和進(jìn)程的概念,演示了如何在Rust中運(yùn)行多線程和多進(jìn)程。該章還介紹了Python中的并發(fā)性,以幫助開發(fā)人員了解其中的差異。
* 第2篇為融合Rust和Python,包括第4~8章。
> 第4章為在Python中構(gòu)建pip模塊,討論了如何構(gòu)建可以使用pip安裝的Python包,還演示了如何在GitHub上托管軟件包,以及配置持續(xù)集成等。
> 第5章為為pip模塊創(chuàng)建Rust接口,介紹了如何將Rust代碼注入pip模塊,并使用Rust設(shè)置工具來編譯和使用Python中的Rust代碼。
> 第6章為在Rust中使用Python對(duì)象,考慮了另一個(gè)方向上的兼容,即在Rust中接受和處理Python數(shù)據(jù)結(jié)構(gòu)并與之交互。該章還討論了如何在Rust中創(chuàng)建自定義Python對(duì)象。
> 第7章為在Rust中使用Python模塊,介紹了如何在Rust代碼中使用諸如NumPy之類的Python模塊。
> 第8章為在Rust中構(gòu)建端到端Python模塊,將所有已經(jīng)討論的內(nèi)容打包成一個(gè)用Rust編寫的功能齊全的Python包。這個(gè)包擁有Python接口和命令行功能,可以接受YAML文件進(jìn)行配置。
* 第3篇為將Rust注入Web應(yīng)用程序,包括第9~11章。
> 第9章為構(gòu)建Python Flask應(yīng)用程序,構(gòu)建了一個(gè)帶有PostgreSQL數(shù)據(jù)庫、NGINX負(fù)載均衡器和Celery工作進(jìn)程的Python Flask應(yīng)用程序,以使Rust技能更加實(shí)用。所有項(xiàng)目都被包裹在Docker中,為將Rust注入Web應(yīng)用程序打下基礎(chǔ)。
> 第10章為將Rust注入Python Flask應(yīng)用程序,討論了如何利用第9章中構(gòu)建的Web應(yīng)用,將Rust模塊注入Celery工作進(jìn)程和Flask應(yīng)用程序的Docker容器。該章還印證了已經(jīng)應(yīng)用的遷移,以自動(dòng)生成數(shù)據(jù)庫的模式,這樣Rust代碼就可以直接與數(shù)據(jù)庫連接。此外,該章還介紹了如何使用來自私有GitHub存儲(chǔ)庫的Rust包。
> 第11章為集成Rust的最佳實(shí)踐,給出了一些提示,說明在為Python編寫Rust代碼時(shí)如何避免常見的錯(cuò)誤。
充分利用本書
建議讀者了解Python并能適應(yīng)面向?qū)ο缶幊。本書將涉及一些高?jí)主題,如元類,但不是必不可少的。Rust編程、Python Web應(yīng)用程序和使用pip安裝的Python模塊等都在 本書中有所涉及。
本書涵蓋的軟件和操作系統(tǒng)需求如表P.1所示。
表P.1 本書涵蓋的軟件和操作系統(tǒng)需求
本書涵蓋的軟件 操作系統(tǒng)需求 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存儲(chǔ)庫訪問代碼(下文將提供鏈接) ,以避免與復(fù)制和粘貼代碼相關(guān)的任何潛在錯(cuò)誤。
下載示例代碼文件
本書隨附的代碼可以在GitHub存儲(chǔ)庫中找到,其網(wǎng)址如下:
https://github.com/PacktPublishing/Speed-up-your-Python-with-Rust
如果代碼有更新,也將在該GitHub存儲(chǔ)庫中更新。
下載彩色圖像
本書提供了一個(gè)PDF文件,其中包含本書中使用的屏幕截圖/圖表的彩色圖像?赏ㄟ^以下地址下載。
https://static.packt-cdn.com/downloads/9781801811446_ColorImages.pdf
本書約定
本書中使用了許多文本約定。
(1)表示文本中的代碼、數(shù)據(jù)庫表名、文件夾名、文件名、文件擴(kuò)展名、路徑名、虛擬URL、用戶輸入和Twitter句柄等的段落示例如下:
2019年,芯片巨頭英偉達(dá)(NVIDIA)公司的聯(lián)合創(chuàng)始人兼首席執(zhí)行官黃仁勛(Jensen Huang)表示,隨著芯片組件越來越接近單個(gè)原子的大小,它變得越來越難以跟上摩爾定律的步伐,因此可以宣布摩爾定律已經(jīng)死亡。有關(guān)詳細(xì)信息,可訪問:
https://www.cnet.com/news/
moores-law-is-dead-nvidias-ceo-jensen-huang-says-at-ces-2019/
。2)有關(guān)代碼塊的設(shè)置如下所示。
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)術(shù)語或重要單詞采用中英文對(duì)照形式,在括號(hào)內(nèi)保留其英文原文。示例如下:
當(dāng)代碼編譯時(shí),它將為棧(stack)中的不同變量分配內(nèi)存;當(dāng)代碼運(yùn)行時(shí),它會(huì)將數(shù)據(jù)存儲(chǔ)在堆(heap)中。
。5)界面詞匯或?qū)S忻~將保留英文原文,在括號(hào)內(nèi)添加其中文翻譯。示例如下:
首先需要將PyPI賬戶的用戶名和密碼存儲(chǔ)在GitHub存儲(chǔ)庫的Secrets(秘密)部分。這可以通過單擊Settings(設(shè)置)選項(xiàng)卡,然后選擇左側(cè)邊欄上的Secrets(秘密)選項(xiàng)來完成。
。6)本書使用了以下兩個(gè)圖標(biāo)。
表示警告或重要的注意事項(xiàng)。
表示提示或小技巧。
·VIII·
Python高效編程基于Rust語言
·VII·
前 言
麥克斯韋爾·弗立頓是一名軟件工程師,為開源的財(cái)務(wù)損失建;饡(huì)(financial loss modeling foundation)OasisLMF工作。2011年,Maxwell取得了英國林肯大學(xué)的護(hù)理學(xué)理學(xué)士學(xué)位。在醫(yī)院急診科工作12小時(shí)的同時(shí),Maxwell還獲得了英國開放大學(xué)的物理學(xué)學(xué)位,然后又邁向了另一個(gè)里程碑,獲得了倫敦大學(xué)醫(yī)學(xué)院的物理學(xué)和工程學(xué)研究生文憑。他曾參與過許多項(xiàng)目,如為德國政府提供醫(yī)療模擬軟件,并在倫敦帝國學(xué)院指導(dǎo)計(jì)算醫(yī)學(xué)學(xué)生。他有在金融科技領(lǐng)域工作的經(jīng)驗(yàn),并曾經(jīng)為Monolith AI公司服務(wù)過。
第1篇 了解Rust
第1章 從Python的角度認(rèn)識(shí)Rust 3
1.1 技術(shù)要求 3
1.2 了解Python和Rust之間的區(qū)別 4
1.2.1 結(jié)合使用Python與Rust的原因 4
1.2.2 在Rust中傳遞字符串 7
1.2.3 在Rust中調(diào)整浮點(diǎn)數(shù)和整數(shù)的大小 9
1.2.4 在Rust的向量和數(shù)組中管理數(shù)據(jù) 11
1.2.5 用哈希映射取代字典 13
1.2.6 Rust中的錯(cuò)誤處理 16
1.3 了解變量所有權(quán) 19
1.3.1 復(fù)制 20
1.3.2 移動(dòng) 20
1.3.3 不可變借用 21
1.3.4 可變借用 23
1.4 跟蹤作用域和生命周期 23
1.5 構(gòu)建結(jié)構(gòu)體而不是對(duì)象 27
1.6 使用宏而不是裝飾器進(jìn)行元編程 31
1.7 小結(jié) 34
1.8 問題 34
1.9 答案 35
1.10 延伸閱讀 35
第2章 使用Rust構(gòu)建代碼 37
2.1 技術(shù)要求 37
2.2 用crate和Cargo代替pip管理代碼 38
2.3 在多個(gè)文件和模塊上構(gòu)建代碼 45
2.4 構(gòu)建模塊接口 49
2.4.1 開發(fā)一個(gè)簡單的股票交易程序 51
2.4.2 寫代碼時(shí)編寫文檔的好處 57
2.5 與環(huán)境交互 58
2.6 小結(jié) 60
2.7 問題 61
2.8 答案 61
2.9 延伸閱讀 62
第3章 理解并發(fā)性 63
3.1 技術(shù)要求 63
3.2 并發(fā)性介紹 63
3.2.1 線程 64
3.2.2 進(jìn)程 65
3.3 使用線程的基本異步編程 67
3.3.1 在Python中使用線程 68
3.3.2 在Rust中使用線程 69
3.4 運(yùn)行多個(gè)進(jìn)程 74
3.4.1 在Python中使用多進(jìn)程池 74
3.4.2 在Rust中使用多線程池 78
3.4.3 在Rust中使用多進(jìn)程池 81
3.5 安全地自定義線程和進(jìn)程 85
3.5.1 阿姆達(dá)爾定律 85
3.5.2 死鎖 86
3.5.3 競爭條件 88
3.6 小結(jié) 88
3.7 問題 89
3.8 答案 89
3.9 延伸閱讀 90
第2篇 融合Rust和Python
第4章 在Python中構(gòu)建pip模塊 95
4.1 技術(shù)要求 95
4.2 為Python pip模塊配置設(shè)置工具 96
4.2.1 創(chuàng)建GitHub存儲(chǔ)庫 96
4.2.2 定義基本參數(shù) 99
4.2.3 定義自述文件 100
4.2.4 定義基本模塊 101
4.3 在pip模塊中打包Python代碼 102
4.3.1 構(gòu)建斐波那契計(jì)算代碼 103
4.3.2 創(chuàng)建命令行接口 105
4.3.3 構(gòu)建單元測(cè)試 107
4.4 配置持續(xù)集成 113
4.4.1 手動(dòng)部署到PyPI 113
4.4.2 管理依賴項(xiàng) 115
4.4.3 為Python設(shè)置類型檢查 116
4.4.4 使用GitHub Actions設(shè)置和運(yùn)行測(cè)試及類型檢查 117
4.4.5 為pip包創(chuàng)建自動(dòng)版本控制 121
4.4.6 使用GitHub Actions部署到PyPI 124
4.5 小結(jié) 126
4.6 問題 127
4.7 答案 128
4.8 延伸閱讀 128
第5章 為pip模塊創(chuàng)建Rust接口 129
5.1 技術(shù)要求 129
5.2 使用pip打包Rust代碼 130
5.2.1 定義gitignore和Cargo 130
5.2.2 配置Python設(shè)置過程 132
5.2.3 安裝Rust庫 134
5.3 使用PyO3 crate構(gòu)建Rust接口 135
5.3.1 構(gòu)建計(jì)算斐波那契數(shù)列的Rust代碼 136
5.3.2 創(chuàng)建命令行工具 138
5.3.3 創(chuàng)建適配器 140
5.3.4 使用單例設(shè)計(jì)模式構(gòu)建適配器接口 142
5.3.5 在Python控制臺(tái)中測(cè)試適配器接口 146
5.4 為Rust包構(gòu)建測(cè)試 148
5.5 比較Python、Rust和Numba的速度 151
5.6 小結(jié) 153
5.7 問題 154
5.8 答案 154
5.9 延伸閱讀 155
第6章 在Rust中使用Python對(duì)象 157
6.1 技術(shù)要求 157
6.2 將復(fù)雜的Python對(duì)象傳遞到Rust中 157
6.2.1 更新setup.py文件以支持.yml加載 158
6.2.2 定義.yml加載命令 159
6.2.3 處理來自Python字典的數(shù)據(jù) 160
6.2.4 從配置文件中提取數(shù)據(jù) 164
6.2.5 將Python字典返回到Python系統(tǒng) 165
6.3 檢查和使用自定義Python對(duì)象 167
6.3.1 為Rust接口創(chuàng)建一個(gè)對(duì)象 167
6.3.2 在Rust中獲取Python GIL 168
6.3.3 向新創(chuàng)建的PyDict結(jié)構(gòu)體添加數(shù)據(jù) 170
6.3.4 設(shè)置自定義對(duì)象的特性 172
6.4 在Rust中構(gòu)建自定義Python對(duì)象 173
6.4.1 定義具有所需特性的Python類 174
6.4.2 定義類靜態(tài)方法處理輸入 174
6.4.3 定義類構(gòu)造函數(shù) 175
6.4.4 包裝并測(cè)試模塊 176
6.5 小結(jié) 179
6.6 問題 180
6.7 答案 180
6.8 延伸閱讀 181
第7章 在Rust中使用Python模塊 183
7.1 技術(shù)要求 183
7.2 認(rèn)識(shí)NumPy 183
7.2.1 在NumPy中執(zhí)行向量相加操作 184
7.2.2 在純Python中執(zhí)行向量相加操作 185
7.2.3 在Rust中使用NumPy執(zhí)行向量相加操作 186
7.3 在NumPy中構(gòu)建模型 190
7.3.1 定義模型 190
7.3.2 構(gòu)建一個(gè)執(zhí)行模型的Python對(duì)象 192
7.4 在Rust中使用NumPy和其他Python模塊 195
7.5 在Rust中重建NumPy模型 198
7.5.1 構(gòu)建get_weight_matrix和invert_get_weight_matrix函數(shù) 200
7.5.2 構(gòu)建get_parameters、get_times和get_input_vector函數(shù) 201
7.5.3 構(gòu)建calculate_parameters和calculate_times函數(shù) 202
7.5.4 將計(jì)算函數(shù)添加到Python綁定 203
7.5.5 將NumPy依賴項(xiàng)添加到setup.py文件 204
7.5.6 構(gòu)建Python接口 204
7.6 小結(jié) 205
7.7 問題 206
7.8 答案 206
7.9 延伸閱讀 207
第8章 在Rust中構(gòu)建端到端Python模塊 209
8.1 技術(shù)要求 209
8.2 分解一個(gè)災(zāi)難建模問題 209
8.3 將端到端解決方案構(gòu)建為一個(gè)包 214
8.3.1 構(gòu)建災(zāi)難足跡合并流程 215
8.3.2 構(gòu)建災(zāi)難脆弱性合并流程 217
8.3.3 在Rust中構(gòu)建Python接口 221
8.3.4 在Python中構(gòu)建接口 223
8.3.5 構(gòu)建包安裝說明 223
8.4 使用和測(cè)試包 225
8.4.1 使用Pandas構(gòu)建Python構(gòu)造模型 226
8.4.2 構(gòu)建隨機(jī)事件ID生成器函數(shù) 227
8.4.3 為Python和Rust實(shí)現(xiàn)計(jì)時(shí) 228
8.5 小結(jié) 230
8.6 延伸閱讀 230
第3篇 將Rust注入Web應(yīng)用程序
第9章 構(gòu)建Python Flask應(yīng)用程序 233
9.1 技術(shù)要求 233
9.2 構(gòu)建一個(gè)基本的Flask應(yīng)用程序 234
9.2.1 為應(yīng)用程序構(gòu)建一個(gè)入口點(diǎn) 235
9.2.2 構(gòu)建斐波那契數(shù)計(jì)算模塊 235
9.2.3 為應(yīng)用程序構(gòu)建Docker鏡像 237
9.2.4 構(gòu)建NGINX服務(wù) 239
9.2.5 連接并運(yùn)行NGINX服務(wù) 241
9.3 定義數(shù)據(jù)訪問層 243
9.3.1 在docker-compose中定義PostgreSQL數(shù)據(jù)庫 244
9.3.2 構(gòu)建配置加載系統(tǒng) 245
9.3.3 構(gòu)建數(shù)據(jù)訪問層 247
9.3.4 搭建應(yīng)用程序數(shù)據(jù)庫遷移系統(tǒng) 249
9.3.5 建立數(shù)據(jù)庫模型 252
9.3.6 將數(shù)據(jù)庫訪問層應(yīng)用于fib計(jì)算視圖 253
9.4 構(gòu)建消息總線 255
9.4.1 為Flask構(gòu)建一個(gè)Celery代理 256
9.4.2 為Celery構(gòu)建一個(gè)斐波那契計(jì)算任務(wù) 258
9.4.3 用Celery更新計(jì)算視圖 258
9.4.4 在Docker中定義Celery服務(wù) 259
9.5 小結(jié) 262
9.6 問題 263
9.7 答案 263
9.8 延伸閱讀 264
第10章 將Rust注入Python Flask應(yīng)用程序 265
10.1 技術(shù)要求 265
10.2 將Rust融合到Flask和Celery中 266
10.2.1 定義對(duì)Rust斐波那契數(shù)計(jì)算包的依賴 266
10.2.2 用Rust構(gòu)建計(jì)算模型 266
10.2.3 使用Rust創(chuàng)建計(jì)算視圖 269
10.2.4 將Rust插入Celery任務(wù)中 270
10.3 使用Rust部署Flask和Celery 271
10.4 使用私有GitHub存儲(chǔ)庫進(jìn)行部署 273
10.4.1 構(gòu)建一個(gè)協(xié)調(diào)整個(gè)過程的Bash腳本 275
10.4.2 在Dockerfile中重新配置Rust斐波那契數(shù)列計(jì)算包的安裝 275
10.5 將Rust與數(shù)據(jù)訪問相結(jié)合 277
10.5.1 設(shè)置數(shù)據(jù)庫克隆包 277
10.5.2 設(shè)置diesel環(huán)境 279
10.5.3 自動(dòng)生成和配置數(shù)據(jù)庫模型和模式 280
10.5.4 在Rust中定義數(shù)據(jù)庫連接 282
10.5.5 創(chuàng)建一個(gè)獲取并返回所有斐波那契記錄的Rust函數(shù) 282
10.6 在Flask中部署Rust nightly包 285
10.7 小結(jié) 286
10.8 問題 286
10.9 答案 287
10.10 延伸閱讀 287
第11章 集成Rust的最佳實(shí)踐 289
11.1 技術(shù)要求 289
11.2 通過將數(shù)據(jù)傳入和傳出Rust來保持Rust實(shí)現(xiàn)的簡單性 290
11.2.1 構(gòu)建一個(gè)Python腳本來制定用于計(jì)算的數(shù)字的格式 290
11.2.2 構(gòu)建一個(gè)接受數(shù)字進(jìn)行計(jì)算并返回結(jié)果的Rust文件 291
11.2.3 構(gòu)建一個(gè)接受計(jì)算出的數(shù)字并將其打印出來的Python腳本 292
11.3 通過對(duì)象給接口一種原生的感覺 294
11.4 使用trait而不是對(duì)象 298
11.4.1 定義trait 300
11.4.2 通過trait定義結(jié)構(gòu)體的行為 301
11.4.3 通過函數(shù)傳遞trait 303
11.4.4 存儲(chǔ)具有共同trait的結(jié)構(gòu)體 305
11.4.5 在main.rs文件中運(yùn)行程序 305
11.5 通過Rayon保持?jǐn)?shù)據(jù)并行的簡單性 308
11.6 小結(jié) 310
11.7 延伸閱讀 310
·XIV·
Python高效編程基于Rust語言
·XV·
目 錄