極速Python:高性能編碼、計(jì)算與數(shù)據(jù)分析
定 價:79.8 元
叢書名:數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)
- 作者:[美] 蒂亞戈·羅德里格斯·安道(Tiago Rodrigues Antao)著 沈沖 譯
- 出版時間:2024/3/1
- ISBN:9787302656296
- 出 版 社:清華大學(xué)出版社
- 中圖法分類:TP311.561
- 頁碼:260
- 紙張:
- 版次:1
- 開本:16開
《極速Python:高性能編碼、計(jì)算與數(shù)據(jù)分析》系統(tǒng)性地介紹了Python高性能編程的各種工具和方法,并重點(diǎn)講解了Python在大數(shù)據(jù)中的應(yīng)用。書中配有清晰的示例和詳實(shí)的分析,可幫助讀者熟練掌握NumPy和Pandas,實(shí)現(xiàn)高性能的數(shù)據(jù)存儲和I/O。本書高屋建瓴、不留遺漏,讀者學(xué)習(xí)本書后,能從代碼到架構(gòu)對系統(tǒng)進(jìn)行整體優(yōu)化。
主要內(nèi)容
● 使用Cython重構(gòu)關(guān)鍵代碼。
● 設(shè)計(jì)健壯的數(shù)據(jù)結(jié)構(gòu)。
● 精簡不同架構(gòu)的代碼。
● 實(shí)現(xiàn)Python GPU計(jì)算。
《極速Python:高性能編碼、計(jì)算與數(shù)據(jù)分析》直擊Python編程要害。對于大型數(shù)據(jù)項(xiàng)目,過慢的代碼運(yùn)行速度是毀滅性的。在機(jī)器學(xué)習(xí)和大規(guī)模數(shù)據(jù)分析中,除了使用高性能的Python代碼,還要使用經(jīng)過優(yōu)化的庫、發(fā)揮計(jì)算機(jī)硬件的多核處理能力。滿足計(jì)算速度后,還要優(yōu)化計(jì)算資源、控制計(jì)算成本,而《極速Python:高性能編碼、計(jì)算與數(shù)據(jù)分析》為讀者提供了一整套高性能編程解決方案。
若干年前,我們團(tuán)隊(duì)正在使用的基于Python的數(shù)據(jù)管道突然崩潰,導(dǎo)致某個進(jìn)程持續(xù)占用CPU。該組件對公司業(yè)務(wù)至關(guān)重要,因此必須盡快解決該問題。我們核查了算法,始終沒有發(fā)現(xiàn)問題。算法的實(shí)現(xiàn)步驟其實(shí)非常簡單,但經(jīng)過多名工程師的數(shù)小時排查,才發(fā)現(xiàn)問題在于程序在一個非常大的列表上進(jìn)行搜索。在將列表轉(zhuǎn)換為集合后,問題就迎刃而解了。最終,數(shù)據(jù)結(jié)構(gòu)不僅變得更小,搜索時間也從數(shù)小時降低到毫秒級別。
這次故障對我觸動很大:
● 雖然問題并不嚴(yán)重,但暴露出團(tuán)隊(duì)在開發(fā)過程中并不關(guān)注性能問題。如果經(jīng)常使用代碼分析器,我們就能在幾分鐘內(nèi)發(fā)現(xiàn)問題,而不是耗費(fèi)了好幾個小時。
● 我們最終解決了問題,并且取得了雙贏的結(jié)果,不僅程序查詢時間更短,占用內(nèi)存也更少。雖然在許多情況下,面對性能和成本需要做出取舍,但在某些情況下,兼顧兩者不僅能獲得滿意的結(jié)果,還沒有任何負(fù)面影響。
● 從更高的角度審視,結(jié)果也是雙贏的。首先,查詢速度更快非常有利于公司業(yè)務(wù)。其次,算法經(jīng)過優(yōu)化后,使用CPU的時間更短、耗能更低,也更加環(huán)保。
● 雖然單個案例意義有限,但我意識到許多程序員或許都在尋找類似的優(yōu)化解決方案。
因此,我決定編寫本書,以便其他程序員可以從中受益。我的目標(biāo)是幫助經(jīng)驗(yàn)豐富的Python程序員設(shè)計(jì)和實(shí)現(xiàn)更高效的解決方案,同時能夠了解底層的權(quán)衡機(jī)制。我將采用全面且透徹的方式,通過探討Python代碼和重要的Python庫,從算法角度來探究現(xiàn)代硬件架構(gòu)及其影響,并分析CPU和存儲性能。希望本書能夠幫助讀者在使用Python生態(tài)進(jìn)行開發(fā)時,游刃有余地處理性能問題。
關(guān) 于 本 書
本書旨在幫助讀者在Python生態(tài)系統(tǒng)中編寫更高效的應(yīng)用程序。更高效是指讓代碼使用的CPU周期更少、占用的存儲空間更少、消耗的網(wǎng)絡(luò)通信更少。
本書采用全面且透徹的方式來分析性能問題。書中不僅涉及純Python代碼的優(yōu)化技術(shù),還介紹了如何高效使用數(shù)據(jù)科學(xué)庫,如NumPy和pandas。由于Python在某些場景下性能不足,為了使代碼運(yùn)行速度更快,本書還講解了Cython。為了使內(nèi)容盡量全面,本書還討論了硬件對代碼設(shè)計(jì)的影響,即分析現(xiàn)代計(jì)算機(jī)架構(gòu)對算法性能的影響。另外,還探究了網(wǎng)絡(luò)架構(gòu)對效率的影響,以及GPU計(jì)算在快速數(shù)據(jù)分析領(lǐng)域中的運(yùn)用。
目標(biāo)讀者
本書面向中高級讀者。希望讀者接觸過目錄中的大部分技術(shù),并且最好親手使用過其中一些。除了IO庫和GPU計(jì)算章節(jié),本書只提供了很少的介紹性內(nèi)容,所以要求讀者了解基礎(chǔ)知識。如果你正在編寫高性能代碼,并面臨高效處理海量數(shù)據(jù)的切實(shí)挑戰(zhàn),這本書可提供很多建議。
為了從本書吸收更多的知識,你應(yīng)該具備多年的Python編程經(jīng)驗(yàn),熟悉Python控制流、列表、集合和字典,并具備一定Python標(biāo)準(zhǔn)庫的使用經(jīng)驗(yàn),如os、sys、pickle和multiprocessing。為了充分運(yùn)用書中介紹的技術(shù),你或多或少應(yīng)操作過標(biāo)準(zhǔn)的數(shù)據(jù)分析庫,即NumPy和pandas,例如使用過NumPy中的數(shù)組和pandas中的數(shù)據(jù)幀。
如果你清楚如何通過C或Rust等語言接口來加速Python代碼,或者了解Cython或Numba等優(yōu)化工具,即使沒有實(shí)際操作過,本書對你也會很有幫助。在Python中處理IO的經(jīng)驗(yàn)對你也會有所幫助。鑒于IO庫方面的學(xué)習(xí)資料較少,我們將從Apache Parque和Zarr庫開始介紹。
讀者應(yīng)該熟練使用Linux終端(或MacOS終端)的基本命令。如果使用Windows,請安裝基于UNIX的終端,并熟悉命令行或PowerShell。此外,你還需要在計(jì)算機(jī)上安裝Python。
在某些示例中,我會講解云計(jì)算技巧,但訪問云或了解云計(jì)算方面的知識不是閱讀本書的必要條件。如果你對云計(jì)算方法感興趣,建議學(xué)習(xí)執(zhí)行云計(jì)算的基本操作,例如,創(chuàng)建實(shí)例和訪問云服務(wù)存儲。
雖然本書不要求讀者接受過學(xué)術(shù)培訓(xùn),但了解復(fù)雜度的基本概念是有益的。例如,理解與數(shù)據(jù)量呈線性關(guān)系的算法優(yōu)于與數(shù)據(jù)量呈指數(shù)關(guān)系的算法。如果你想使用GPU進(jìn)行優(yōu)化,閱讀本書前無需了解相關(guān)內(nèi)容。
本書內(nèi)容:學(xué)習(xí)路線圖
本書各章基本是獨(dú)立的,讀者可以翻閱任何感興趣的章節(jié)。全書內(nèi)容分為四部分。
第Ⅰ部分“基礎(chǔ)知識”(第1~4章),涵蓋了入門知識。
● 第1章介紹了海量數(shù)據(jù)帶來的問題,并解釋了為什么必須關(guān)注計(jì)算和存儲的效率。本章還介紹了全書的學(xué)習(xí)方法,并提供了如何根據(jù)需求學(xué)習(xí)本書的建議。
● 第2章講解了對原生Python代碼進(jìn)行優(yōu)化的方法。本章還討論了Python數(shù)據(jù)結(jié)構(gòu)的優(yōu)化、代碼分析、內(nèi)存分配和惰性編程技術(shù)。
● 第3章討論了Python中的并發(fā)和并行,以及如何最佳利用多進(jìn)程和多線程(包括使用線程進(jìn)行并行處理的限制)。本章還介紹了異步處理,它通常用于Web服務(wù)中的低負(fù)載、多并發(fā)請求場景。
● 第4章介紹了NumPy,NumPy是用于高效處理多維數(shù)組的庫。NumPy是當(dāng)前所有數(shù)據(jù)處理技術(shù)的核心,是眾多方法的基本庫。本章分享了NumPy中的關(guān)鍵功能,如視圖、廣播和數(shù)組編程,以開發(fā)更高效的代碼。
第Ⅱ部分“硬件”(第5章和第6章),主要涉及如何發(fā)揮硬件和網(wǎng)絡(luò)的最大效率。
● 第5章介紹了Cython。Cython基于Python,可以生成非常高效的代碼。Python屬于高級解釋性語言,因此不適合用于優(yōu)化硬件。其他幾種語言,如C或Rust,從設(shè)計(jì)之初就能在硬件層高效運(yùn)行。Cython屬于底層語言,雖然它與Python很相似,但可以將Cython編譯成C代碼。要想寫出高效的Cython代碼,關(guān)鍵在于掌握代碼基礎(chǔ)和實(shí)現(xiàn)方法。在本章中,我們就將學(xué)習(xí)如何編寫高效的Cython代碼。
● 第6章討論了硬件架構(gòu)對高效Python代碼設(shè)計(jì)的影響。鑒于計(jì)算機(jī)的設(shè)計(jì)模式,反直覺的編程方法可能比預(yù)期的更有效率。例如,在某些情況下,即使需要承擔(dān)解壓縮算法的計(jì)算開銷,處理壓縮數(shù)據(jù)也可能比處理未壓縮數(shù)據(jù)的速度更快。本章還介紹了CPU、內(nèi)存、存儲和網(wǎng)絡(luò)對Python算法設(shè)計(jì)的影響。另外,本章討論了NumExpr庫,它能利用最新的硬件架構(gòu)特性使NumPy代碼更高效。
第Ⅲ部分“用于現(xiàn)代數(shù)據(jù)處理的應(yīng)用和庫”(第7章和第8章),探討了最新的用于數(shù)據(jù)處理的應(yīng)用和庫。
● 第7章討論了如何高效使用pandas,pandas是Python中的數(shù)據(jù)幀庫。我們將研究pandas相關(guān)的技術(shù),以優(yōu)化代碼。和本書大多數(shù)章節(jié)不同,這一章的內(nèi)容基于前面的章節(jié)。pandas是在NumPy的基礎(chǔ)上工作的,所以會借鑒第4章的內(nèi)容,探索與NumPy相關(guān)的技術(shù)進(jìn)而優(yōu)化pandas。我們還將探究如何用NumExpr和Cython優(yōu)化pandas。最后,介紹了Arrow庫,除了可以提高處理pandas數(shù)據(jù)幀的性能,它還具有其他強(qiáng)大的功能。
● 第8章探討了數(shù)據(jù)持久化的優(yōu)化問題。我們討論了能高效處理列型數(shù)據(jù)的庫Parquet,以及能處理大型磁盤數(shù)組的庫Zarr。本章還討論了如何處理超過內(nèi)存容量的數(shù)據(jù)集。
第Ⅳ部分“高級主題”(第9章和第10章),涉及最后兩個與眾不同的方法,即GPU和Dask庫。
● 第9章探討了圖形處理單元(Graphical Processing Unit,GPU)在處理大型數(shù)據(jù)集方面的使用方法。我們將看到,GPU計(jì)算模型使用大量簡單的處理單元,完全可以處理最新的數(shù)據(jù)科學(xué)問題。我們使用了兩種不同的方法以利用GPU的優(yōu)勢。首先,將討論現(xiàn)有GPU方面的庫,這些庫提供了與其他庫類似的接口,例如CuPy是NumPy的GPU版本。另外,本章還介紹如何編寫在GPU上運(yùn)行的Python代碼。
● 第10章討論了Dask。使用Dask庫能編寫出輕松擴(kuò)展到計(jì)算集群上的并行代碼,它提供了類似于NumPy和pandas的接口。計(jì)算集群既可以位于本地,又可以位于云端。
該書最后還包括兩個附錄。
● 附錄A介紹如何安裝所必需的軟件,以使用書中的示例。
● 附錄B介紹Numba。Numba是Cython的替代品,可以生成高效的底層代碼。Cython和Numba是生成底層代碼的主要途徑。為了解決真實(shí)場景中的問題,我推薦使用Numba。但是,為什么正文中用了一整章來介紹Cython,卻將Numba放在附錄中呢?這是因?yàn)楸緯闹饕繕?biāo)是為你打下堅(jiān)實(shí)的基礎(chǔ),確保能在Python生態(tài)系統(tǒng)中編寫出高效的代碼,而Cython更適合深入了解內(nèi)部的計(jì)算機(jī)制。
獲取代碼
本書包含許多源代碼示例,既有行間代碼,又有行內(nèi)代碼。為了區(qū)別于普通文本,這兩種樣式的源代碼都采用等寬字體。有時,也會加粗代碼,以強(qiáng)調(diào)代碼發(fā)生的變動,例如,為已有代碼添加新功能。
在許多示例中,不得不對初始源代碼的樣式進(jìn)行調(diào)整。為了使頁面版式更加美觀,添加了換行符,并重新進(jìn)行排版縮進(jìn)。但在極少數(shù)情況下,如此調(diào)整后還要使用連行符(?)。此外,如果文本中對代碼進(jìn)行了解釋,通常會刪除源代碼中的注釋。許多代碼附帶有注釋,以突出重要概念。
本書示例的完整代碼可從GitHub倉庫(https://github.com/tiagoantao/python-performance) 下載,或掃描本書封底的二維碼進(jìn)行下載。當(dāng)發(fā)現(xiàn)錯誤或需要更新Python和庫時,我會更新代碼倉庫。因此,請讀者留意代碼倉庫的變動。代碼倉庫為每個章節(jié)列出了詳細(xì)目錄。
人們對代碼風(fēng)格各有偏好,我盡量調(diào)整了書中的代碼,以使代碼在紙質(zhì)版的書中看起來更加美觀。例如,我本來喜歡使用較長且具有描述性的變量名,但這種名稱的印刷效果一般。因此,書中使用表達(dá)性的變量名,并遵循標(biāo)準(zhǔn)的Python慣例,如PEP8,同時確保印刷效果的美觀。本書對類型注釋也采取了同樣的做法,我原本想使用類型注釋,但類型注釋妨礙了代碼的可讀性。在極少數(shù)情況下,我使用算法來增強(qiáng)可讀性,但算法并不能應(yīng)對所有極端情況,或使代碼邏輯更加清晰。
在大多數(shù)情況下,本書中的代碼適用于標(biāo)準(zhǔn)的Python解釋器。在少數(shù)情況下,需要使用IPython,特別是進(jìn)行性能分析時。你也可以使用Jupyter Notebook。
關(guān)于安裝的細(xì)節(jié)可以參考附錄A。如果任何章節(jié)需要使用特殊的軟件,將在適當(dāng)?shù)牡胤阶⒚鳌?br />
硬件和軟件
讀者可以使用任何操作系統(tǒng)運(yùn)行本書中的代碼。不過,大部分生產(chǎn)代碼都部署在Linux上,因此Linux是首選系統(tǒng);蛘,也可以直接使用MacOS X。如果使用的是Windows,建議安裝Windows Subsystem for Linux(WSL) 。
除了操作系統(tǒng),還可以選擇Docker。讀者可以使用代碼倉庫中提供的Docker鏡像,Docker提供了容器化的Linux環(huán)境來運(yùn)行代碼。
建議你使用的計(jì)算機(jī)至少擁有16 GB的內(nèi)存和150 GB的可用磁盤空間。第9章涉及與GPU相關(guān)的內(nèi)容,需要使用NVIDIA GPU,最低基于Pascal架構(gòu)。過去五年中發(fā)布的大多數(shù)GPU都符合此要求。為了充分學(xué)習(xí)本書內(nèi)容,有關(guān)環(huán)境準(zhǔn)備的詳細(xì)信息,請參見附錄A。
Tiago Rodrigues Antão擁有信息學(xué)工程學(xué)士學(xué)位和生物信息學(xué)博士學(xué)位。他目前從事生物技術(shù)工作,使用Python生態(tài)來處理科學(xué)計(jì)算和數(shù)據(jù)工程任務(wù)。大多數(shù)時候,他也使用底層編程語言(如C和Rust)對算法的關(guān)鍵部分進(jìn)行優(yōu)化。目前,他在基于Amazon AWS的云計(jì)算設(shè)備上進(jìn)行開發(fā),但使用的基本是本地計(jì)算集群。
除了業(yè)內(nèi)經(jīng)歷,他在科學(xué)計(jì)算方面有兩段學(xué)術(shù)經(jīng)歷,包括在劍橋大學(xué)和牛津大學(xué)從事數(shù)據(jù)分析博士后研究工作。作為蒙大拿大學(xué)的研究員,他從零開始創(chuàng)建了用于分析生物數(shù)據(jù)的整套科學(xué)計(jì)算方法。
Tiago是重要生物信息軟件包Biopython(用Python編寫)的共同作者之一,也是Bioinformatics with Python Cookbook(Packt出版社,2022)一書的作者,該書已出版了第3版。他還在生物信息學(xué)領(lǐng)域發(fā)表了多篇重要的科研論文。
第Ⅰ部分 基礎(chǔ)知識
第1章 對高效數(shù)據(jù)處理的迫切需求 3
1.1 數(shù)據(jù)泛濫的嚴(yán)重性 4
1.2 現(xiàn)代計(jì)算架構(gòu)和高性能計(jì)算 6
1.2.1 計(jì)算機(jī)內(nèi)部的變化 7
1.2.2 網(wǎng)絡(luò)的變化 8
1.2.3 云計(jì)算 9
1.3 Python的局限性 10
1.4 解決方案小結(jié) 11
1.5 本章小結(jié) 13
第2章 發(fā)揮內(nèi)置功能的最高性能 15
2.1 分析同時具有IO和計(jì)算
任務(wù)的應(yīng)用程序 16
2.1.1 下載數(shù)據(jù)并計(jì)算最低溫度 16
2.1.2 Python的內(nèi)置分析模塊 18
2.1.3 使用本地緩存 19
2.2 對代碼進(jìn)行分析以檢測性能瓶頸 20
2.2.1 可視化分析信息 21
2.2.2 行分析 22
2.2.3 代碼分析小結(jié) 23
2.3 優(yōu)化基本數(shù)據(jù)結(jié)構(gòu):列表、集合、字典 24
2.3.1 列表搜索的性能 25
2.3.2 使用集合進(jìn)行搜索 25
2.3.3 Python中的列表、集合和字典的復(fù)雜性 26
2.4 節(jié)約內(nèi)存 27
2.4.1 Python內(nèi)存估算 28
2.4.2 其他表示方法的內(nèi)存占用 30
2.4.3 使用數(shù)組進(jìn)行緊湊表示 32
2.4.4 串聯(lián)知識點(diǎn):估算Python對象的內(nèi)存占用 33
2.4.5 Python對象內(nèi)存占用小結(jié) 34
2.5 在大數(shù)據(jù)管道中使用惰性編程和生成器 34
2.6 本章小結(jié) 36
第3章 并發(fā)、并行和異步 37
3.1 編寫異步服務(wù)器框架 39
3.1.1 實(shí)現(xiàn)與客戶通信的框架 41
3.1.2 協(xié)程 42
3.1.3 使用簡單的同步客戶端發(fā)送復(fù)雜數(shù)據(jù) 43
3.1.4 實(shí)現(xiàn)進(jìn)程間通信的其他方法 44
3.1.5 異步編程小結(jié) 45
3.2 實(shí)現(xiàn)基本的MapReduce引擎 45
3.2.1 理解MapReduce框架 45
3.2.2 開發(fā)簡單的測試場景 46
3.2.3 第一次實(shí)現(xiàn)MapReduce框架 47
3.3 實(shí)現(xiàn)MapReduce并發(fā)引擎 47
3.3.1 使用concurrent.futures實(shí)現(xiàn)線程服務(wù)器 47
3.3.2 使用futures異步執(zhí)行 49
3.3.3 GIL和多線程 51
3.4 使用多進(jìn)程實(shí)現(xiàn)MapReduce 52
3.4.1 基于concurrent.futures的解決方案 52
3.4.2 基于多進(jìn)程模塊的解決方案 53
3.4.3 監(jiān)控多進(jìn)程方法的進(jìn)度 54
3.4.4 分塊傳輸數(shù)據(jù) 56
3.5 知識點(diǎn)串聯(lián):異步多線程和多進(jìn)程MapReduce 服務(wù)器 59
3.5.1 創(chuàng)建完整的高性能解決方案 59
3.5.2 創(chuàng)建強(qiáng)大且穩(wěn)定的服務(wù)器 62
3.6 本章小結(jié) 63
第4章 高性能NumPy 65
4.1 理解NumPy的性能 66
4.1.1 數(shù)組的副本與視圖 66
4.1.2 NumPy的視圖機(jī)制 71
4.1.3 利用視圖提高效率 75
4.2 數(shù)組編程 77
4.2.1 小結(jié) 78
4.2.2 NumPy中的廣播 78
4.2.3 應(yīng)用數(shù)組編程 80
4.2.4 矢量化計(jì)算 82
4.3 改進(jìn)NumPy內(nèi)部架構(gòu) 85
4.3.1 NumPy的依賴關(guān)系 85
4.3.2 在Python發(fā)行版中調(diào)整NumPy 87
4.3.3 NumPy中的線程 88
4.4 本章小結(jié) 89
第Ⅱ部分 硬件
第5章 使用Cython重構(gòu)核心代碼 93
5.1 重構(gòu)高效代碼的方法 93
5.2 Cython快速入門 95
5.2.1 Cython實(shí)現(xiàn) 95
5.2.2 使用Cython注釋提高性能 97
5.2.3 為什么注釋可以提升性能 98
5.2.4 為函數(shù)返回值添加類型 100
5.3 分析Cython代碼 101
5.3.1 使用Python的內(nèi)置分析方法 101
5.3.2 使用line_profiler 103
5.4 用Cython內(nèi)存視圖優(yōu)化數(shù)組訪問 105
5.4.1 小結(jié) 107
5.4.2 清理Python內(nèi)部交互 107
5.5 在Cython中編寫NumPy通用函數(shù) 108
5.6 Cython高級數(shù)組訪問 110
5.6.1 繞過GIL并同時運(yùn)行多個線程 112
5.6.2 基本性能分析 116
5.6.3 使用Quadlife的視頻示例 116
5.7 Cython并行計(jì)算 117
5.8 本章小結(jié) 118
第6章 內(nèi)存層級、存儲和網(wǎng)絡(luò) 121
6.1 現(xiàn)代硬件架構(gòu)如何影響Python性能 122
6.1.1 現(xiàn)代架構(gòu)對性能的反直覺影響 122
6.1.2 CPU緩存如何影響算法效率 123
6.1.3 現(xiàn)代持久化存儲 124
6.1.4 小結(jié) 125
6.2 使用Blosc進(jìn)行高效
數(shù)據(jù)存儲 125
6.2.1 壓縮數(shù)據(jù)以節(jié)省時間 125
6.2.2 讀取速度(和內(nèi)存緩沖區(qū)) 127
6.2.3 不同壓縮算法對存儲性能的影響 128
6.2.4 探究數(shù)據(jù)表示以提高壓縮率 128
6.2.5 小結(jié) 129
6.3 使用NumExpr加速NumPy 129
6.3.1 快速表達(dá)式處理 129
6.3.2 硬件架構(gòu)的影響 130
6.3.3 不適合NumExpr的場景 131
6.4 本地網(wǎng)絡(luò)對性能的影響 131
6.4.1 REST低效的原因 132
6.4.2 基于UDP和msgpack的
客戶端 132
6.4.3 基于UDP的服務(wù)器 134
6.4.4 為客戶端添加超時機(jī)制 135
6.4.5 優(yōu)化網(wǎng)絡(luò)計(jì)算的其他建議 135
6.5 本章小結(jié) 136
第Ⅲ部分 和于現(xiàn)代數(shù)據(jù)處理的應(yīng)用和庫
第7章 高性能pandas和Apache Arrow 139
7.1 優(yōu)化數(shù)據(jù)加載的內(nèi)存和時間 140
7.1.1 壓縮數(shù)據(jù)與未壓縮數(shù)據(jù) 140
7.1.2 推斷列的類型 141
7.1.3 數(shù)據(jù)類型精度的影響 143
7.1.4 重新編碼和壓縮數(shù)據(jù) 144
7.2 高效數(shù)據(jù)分析方法 147
7.2.1 使用索引加速訪問 147
7.2.2 行的迭代方法 148
7.3 基于NumPy、Cython和NumExpr的pandas 150
7.3.1 顯式使用NumPy 151
7.3.2 基于NumExpr的pandas 151
7.3.3 Cython和pandas 153
7.4 使用Arrow將數(shù)據(jù)讀入pandas 154
7.4.1 pandas和Apache Arrow的關(guān)系 155
7.4.2 讀取CSV文件 156
7.4.3 使用Arrow進(jìn)行分析 158
7.5 使用Arrow互操作將任務(wù)委托給更高效的語言和系統(tǒng) 158
7.5.1 Arrow語言互操作架構(gòu)的意義 159
7.5.2 使用Arrow的Plasma服務(wù)器對數(shù)據(jù)進(jìn)行零拷貝操作 160
7.6 本章小結(jié) 163
第8章 大數(shù)據(jù)存儲 165
8.1 訪問文件的統(tǒng)一接口:fsspec 165
8.1.1 使用fsspec搜索GitHub倉庫中的文件 166
8.1.2 使用fsspec檢查zip文件 167
8.1.3 使用fsspec訪問文件 168
8.1.4 使用URL鏈遍歷不同的文件系統(tǒng) 168
8.1.5 替換文件系統(tǒng)后端 169
8.1.6 使用PyArrow接口 169
8.2 Parquet:高效的列型數(shù)據(jù)存儲格式 170
8.2.1 檢查Parquet元數(shù)據(jù) 170
8.2.2 使用Parquet進(jìn)行列編碼 171
8.2.3 對數(shù)據(jù)集進(jìn)行分區(qū) 173
8.3 使用傳統(tǒng)方法處理大于內(nèi)存的數(shù)據(jù)集 175
8.3.1 使用NumPy對文件進(jìn)行內(nèi)存映射 175
8.3.2 數(shù)據(jù)幀的分塊讀取和寫入 177
8.4 使用Zarr進(jìn)行大型數(shù)組持久化 178
8.4.1 Zarr的內(nèi)部架構(gòu) 179
8.4.2 Zarr中數(shù)組的存儲 181
8.4.3 創(chuàng)建新數(shù)組 183
8.4.4 Zarr數(shù)組的并行讀寫 184
8.5 本章小結(jié) 186
第Ⅳ部分 高級主題
第9章 使用GPU進(jìn)行數(shù)據(jù)分析 189
9.1 理解GPU算力 190
9.1.1 GPU的優(yōu)勢 190
9.1.2 CPU和GPU的關(guān)系 192
9.1.3 GPU的內(nèi)部架構(gòu) 193
9.1.4 軟件架構(gòu) 194
9.2 使用Numba生成GPU代碼 194
9.2.1 安裝Python的GPU軟件 194
9.2.2 使用Numba進(jìn)行GPU編程的基礎(chǔ)知識 195
9.2.3 使用GPU重構(gòu)Mandelbrot示例 198
9.2.4 使用NumPy編寫Mandelbrot代碼 200
9.3 GPU代碼性能分析:CuPy程序案例 201
9.3.1 基于GPU的數(shù)據(jù)分析庫 202
9.3.2 使用CuPy:NumPy基于GPU 202
9.3.3 CuPy基本操作 202
9.3.4 使用Numba編寫Mandelbrot生成器 203
9.3.5 使用CUDA C實(shí)現(xiàn)Mandelbrot生成器 205
9.3.6 GPU代碼分析工具 206
9.4 本章小結(jié) 209
第10章 使用Dask分析大數(shù)據(jù) 211
10.1 Dask的執(zhí)行模型 212
10.1.1 用于比較的pandas基線 212
10.1.2 實(shí)現(xiàn)基于Dask的數(shù)據(jù)幀解決方案 213
10.2 Dask操作的計(jì)算開銷 215
10.2.1 處理數(shù)據(jù)分區(qū) 216
10.2.2 中間計(jì)算持久化 217
10.2.3 分布式數(shù)據(jù)幀上的算法實(shí)現(xiàn) 218
10.2.4 重新對數(shù)據(jù)進(jìn)行分區(qū) 220
10.2.5 分布式數(shù)據(jù)幀持久化 223
10.3 使用Dask的分布式調(diào)度器 224
10.3.1 dask.distributed架構(gòu) 225
10.3.2 使用dask.distributed運(yùn)行代碼 228
10.3.3 處理大于內(nèi)存的數(shù)據(jù)集 232
10.4 本章小結(jié) 234
附錄A 搭建環(huán)境 235
附錄B 使用Numba生成高效的底層代碼 239