産品特色
編輯推薦
適讀人群 :Python程序員,有一定Python語言基礎想要得到進階和提高的讀者 Python代碼僅僅能夠正確運行還不夠,你需要讓它運行得更快。通過探索設計決策背後的基礎理論,本書幫助你更加深刻地理解Python的實現。你將學習如何找到性能瓶頸,以及如何在大數據量的程序中顯著加快代碼。
如何利用多核架構或集群的優點?如何構建一個在不損失可靠性的情況下具備可伸縮性的係統?有經驗的Python程序員將學到針對這些問題或者其他問題的具體解決方案,以及來自那些在社交媒體分析、産品化機器學習和其他場景下使用高性能Python編程的公司的成功案例。
通過閱讀本書,你將能夠:
■ 更好地掌握numpy、Cython和剖析器;
■ 瞭解Python如何抽象化底層的計算機架構;
■ 使用剖析手段來尋找CPU時間和內存使用的瓶頸;
■ 通過選擇閤適的數據結構來編寫高效的程序
■ 加速矩陣和矢量計算;
■ 使用工具把Python編譯成機器代碼;
■ 管理並發的多I/O和計算操作;
■ 把多進程代碼轉換到在本地或者遠程集群上運行;
■ 用更少的內存解決大型問題。
“ 盡管P y thon在學術和工業領域很流行, 但人們也經常由於Python程序運行太慢而放棄它。本書通過全麵介紹改善優化Python計算速度和可擴展性的策略,從而消除人們的這種誤
解。”——Jake VanderPlas 華盛頓大學
內容簡介
Python語言是一種腳本語言,其應用領域非常廣泛,包括數據分析、自然語言處理、機器學習、科學計算、推薦係統構建等。
本書共有12章,圍繞如何進行代碼優化和加快實際應用的運行速度進行詳細講解。本書主要包含以下主題:計算機內部結構的背景知識、列錶和元組、字典和集閤、迭代器和生成器、矩陣和矢量計算、並發、集群和工作隊列等。最後,通過一係列真實案例展現瞭在應用場景中需要注意的問題。
本書適閤初級和中級Python程序員、有一定Python語言基礎想要得到進階和提高的讀者閱讀。
作者簡介
Micha Gorelick在bitly公司從事與數據打交道的工作,並負責建立瞭快速前進實驗室(Fast Forward Labs),研究從機器學習到高性能流算法領域的問題。
Ian Ozsvald是ModelInsight.io的數據科學傢和教師,有著超過十年的Python經驗。他在yCon和PyData會議上教授Python編程,這幾年一直在英國從事關於數據科學和高性能計算方麵的谘詢工作。
目錄
目錄
第1章 理解高性能Python 1
1.1 基本的計算機係統 1
1.1.1 計算單元 2
1.1.2 存儲單元 5
1.1.3 通信層 6
1.2 將基本的元素組裝到一起 8
1.3 為什麼使用Python 12
第2章 通過性能分析找到瓶頸 15
2.1 高效地分析性能 16
2.2 Julia集閤的介紹 17
2.3 計算完整的Julia集閤 20
2.4 計時的簡單方法——打印和修飾 24
2.5 用UNIX的time命令進行簡單的計時 27
2.6 使用cProfile模塊 28
2.7 用runsnakerun對cProfile的輸齣進行可視化 33
2.8 用line_profiler進行逐行分析 34
2.9 用memory_profiler診斷內存的用量 39
2.10 用heapy調查堆上的對象 45
2.11 用dowser實時畫齣變量的實例 47
2.12 用dis模塊檢查CPython字節碼 49
2.13 在優化期間進行單元測試保持代碼的正確性 53
2.14 確保性能分析成功的策略 56
2.15 小結 57
第3章 列錶和元組 58
3.1 一個更有效的搜索 61
3.2 列錶和元組 63
3.2.1 動態數組:列錶 64
3.2.2 靜態數組:元組 67
3.3 小結 68
第4章 字典和集閤 69
4.1 字典和集閤如何工作 72
4.1.1 插入和獲取 73
4.1.2 刪除 76
4.1.3 改變大小 76
4.1.4 散列函數和熵 76
4.2 字典和命名空間 80
4.3 小結 83
第5章 迭代器和生成器 84
5.1 無窮數列的迭代器 87
5.2 生成器的延遲估值 89
5.3 小結 93
第6章 矩陣和矢量計算 94
6.1 問題介紹 95
6.2 Python列錶還不夠嗎 99
6.3 內存碎片 103
6.3.1 理解perf 105
6.3.2 根據perf輸齣做齣抉擇 106
6.3.3 使用numpy 107
6.4 用numpy解決擴散問題 110
6.4.1 內存分配和就地操作 113
6.4.2 選擇優化點:找到需要被修正的地方 116
6.5 numexpr:讓就地操作更快更簡單 120
6.6 告誡故事:驗證你的“優化”(scipy) 121
6.7 小結 123
第7章 編譯成C 126
7.1 可能獲得哪種類型的速度提升 127
7.2 JIT和AOT編譯器的對比 129
7.3 為什麼類型檢查有助代碼更快運行 129
7.4 使用C編譯器 130
7.5 復習Julia集的例子 131
7.6 Cython 131
7.6.1 使用Cython編譯純Python版本 132
7.6.2 Cython注解來分析代碼塊 134
7.6.3 增加一些類型注解 136
7.7 Shed Skin 140
7.7.1 構建擴展模塊 141
7.7.2 內存拷貝的開銷 144
7.8 Cython和numpy 144
7.9 Numba 148
7.10 Pythran 149
7.11 PyPy 151
7.11.1 垃圾收集的差異 152
7.11.2 運行PyPy並安裝模塊 152
7.12 什麼時候使用每種工具 154
7.12.1 其他即將齣現的項目 155
7.12.2 一個圖像處理單元(GPU)的注意點 156
7.12.3 一個對未來編譯器項目的展望 157
7.13 外部函數接口 157
7.13.1 ctypes 158
7.13.2 cffi 160
7.13.3 f2py 163
7.13.4 CPython模塊 166
7.14 小結 170
第8章 並發 171
8.1 異步編程介紹 172
8.2 串行爬蟲 175
8.3 gevent 177
8.4 tornado 182
8.5 AsyncIO 185
8.6 數據庫的例子 188
8.7 小結 191
第9章 multiprocessing模塊 193
9.1 multiprocessing模塊綜述 196
9.2 使用濛特卡羅方法來估算Pi 198
9.3 使用多進程和多綫程來估算Pi 199
9.3.1 使用Python對象 200
9.3.2 並行係統中的隨機數 207
9.3.3 使用numpy 207
9.4 尋找素數 210
9.5 使用進程間通信來驗證素數 221
9.5.1 串行解決方案 225
9.5.2 Na ve Pool解決方案 225
9.5.3 Less Na ve Pool解決方案 226
9.5.4 使用Manager.Value作為一個標記 227
9.5.5 使用Redis作為一個標記 229
9.5.6 使用RawValue作為一個標記 232
9.5.7 使用mmap作為一個標記 232
9.5.8 使用mmap作為一個標記的終極效果 234
9.6 用multiprocessing來共享numpy數據 236
9.7 同步文件和變量訪問 243
9.7.1 文件鎖 243
9.7.2 給Value加鎖 247
9.8 小結 249
第10章 集群和工作隊列 251
10.1 集群的益處 252
10.2 集群的缺陷 253
10.2.1 糟糕的集群升級策略造成華爾街損失4.62億美元 254
10.2.2 Skype的24小時全球中斷 255
10.3 通用的集群設計 255
10.4 怎樣啓動一個集群化的解決方案 256
10.5 使用集群時避免痛苦的方法 257
10.6 三個集群化解決方案 258
10.6.1 為簡單的本地集群使用Parallel Python模塊 259
10.6.2 使用IPython Parallel來支持研究 260
10.7 為魯棒生産集群的NSQ 265
10.7.1 隊列 265
10.7.2 發布者/訂閱者 266
10.7.3 分布式素數計算器 268
10.8 看一下其他的集群化工具 271
10.9 小結 272
第11章 使用更少的RAM 273
11.1 基礎類型的對象開銷高 274
11.2 理解集閤中的RAM使用 278
11.3 字節和Unicode的對比 280
11.4 高效地在RAM中存儲許多文本 281
11.5 使用更少RAM的竅門 290
11.6 概率數據結構 291
11.6.1 使用1字節的Morris計數器來做近似計數 292
11.6.2 K最小值 295
11.6.3 布隆過濾器 298
11.6.4 LogLog計數器 303
11.6.5 真實世界的例子 307
第12章 現場教訓 311
12.1 自適應實驗室(Adaptive Lab)的社交媒體分析(SoMA) 311
12.1.1 自適應實驗室(Adaptive Lab)使用的Python 312
12.1.2 SoMA的設計 312
12.1.3 我們的開發方法論 313
12.1.4 維護SoMA 313
12.1.5 對工程師同行的建議 313
12.2 使用RadimRehurek.com讓深度學習飛翔 314
12.2.1 最佳時機 314
12.2.2 優化方麵的教訓 316
12.2.3 總結 318
12.3 在Lyst.com的大規模産品化的機器學習 318
12.3.1 Python在Lyst的地位 319
12.3.2 集群設計 319
12.3.3 在快速前進的初創公司中做代碼評估 319
12.3.4 構建推薦引擎 319
12.3.5 報告和監控 320
12.3.6 一些建議 320
12.4 在Smesh的大規模社交媒體分析 321
12.4.1 Python在Smesh中的角色 321
12.4.2 平颱 321
12.4.3 高性能的實時字符串匹配 322
12.4.4 報告、監控、調試和部署 323
12.5 PyPy促成瞭成功的Web和數據處理係統 324
12.5.1 先決條件 325
12.5.2 數據庫 325
12.5.3 Web應用 326
12.5.4 OCR和翻譯 326
12.5.5 任務分發和工作者 327
12.5.6 結論 327
12.6 在Lanyrd.com中的任務隊列 327
12.6.1 Python在Lanyrd中的角色 328
12.6.2 使任務隊列變高性能 328
12.6.3 報告、監控、調試和部署 328
12.6.4 對開發者同行的建議 329
《Python高性能編程》 簡介 在快速迭代和效率至上的軟件開發時代,Python憑藉其簡潔的語法和豐富的生態係統,早已成為眾多開發者青睞的語言。然而,當項目規模不斷擴大,對性能的要求日益嚴苛時,原始的Python代碼有時會顯得力不從心。本書《Python高性能編程》正是為瞭解決這一痛點而生,它將帶領讀者深入Python的底層機製,探索各種能夠顯著提升程序運行效率的先進技術和編程範式。 本書並非泛泛而談的Python入門教程,而是專注於如何讓你的Python代碼跑得更快、消耗更少資源。我們將從理解Python解釋器的運作方式入手,揭示其內在的性能瓶頸,並在此基礎上,係統性地介紹一係列行之有效的優化策略。從數據結構的選擇到算法的設計,從並發與並行機製的運用到內存管理的精細化調優,再到利用C/C++等底層語言擴展Python的能力,本書將為你構建一個完整的Python高性能編程知識體係。 誰適閤閱讀本書? 有一定Python基礎的開發者: 假設你已經熟悉Python的基本語法、數據類型、控製流以及麵嚮對象編程,並有實際項目開發經驗。本書將在此基礎上,帶你進入性能優化的進階領域。 需要提升程序運行效率的開發者: 無論你是開發Web後端、數據分析應用、機器學習模型,還是科學計算項目,如果你的程序在處理大規模數據或復雜計算時顯得緩慢,本書將為你提供寶貴的解決方案。 對Python底層機製感興趣的研究者或工程師: 如果你想深入瞭解Python是如何工作的,理解解釋器和標準庫的性能考量,本書將提供深入的洞察。 尋求突破性能瓶頸的團隊負責人或架構師: 瞭解並掌握Python高性能編程的技術,將有助於你帶領團隊構建更具競爭力的産品,解決復雜的性能挑戰。 本書將為你帶來什麼? 第一部分:理解Python性能的基石 在本書的開篇,我們將首先夯實對Python性能的理解。這部分內容並非枯燥的理論堆砌,而是通過生動形象的例子和深入淺齣的講解,讓你真正“看見”Python的運行。 Python解釋器的工作原理: 我們將剖析CPython解釋器如何執行Python代碼,理解字節碼、虛擬機以及垃圾迴收機製。這不僅能幫助你理解為什麼某些代碼會慢,更能讓你知道如何“順著”解釋器的思路去寫代碼。 時間復雜度和空間復雜度: 盡管這是一個經典的概念,但我們將結閤Python的特性,講解如何在實際編程中應用它們來評估和優化代碼。我們將學習如何選擇最優的數據結構和算法,避免因低效的復雜度帶來的性能黑洞。 性能度量與分析工具: 工欲善其事,必先利其器。我們將介紹Python中常用的性能分析工具,如`timeit`模塊、`cProfile`和`line_profiler`等,教你如何準確地定位代碼中的性能瓶頸,將精力集中在最有價值的優化點上。 第二部分:數據結構與算法的性能之道 高效的數據結構和算法是性能優化的核心。本部分將深入探討在Python中如何做齣最優選擇,以及如何編寫更高效的算法。 Python內置數據結構的性能特點: 從列錶(list)、元組(tuple)、字典(dict)到集閤(set),我們將詳細分析它們的底層實現,探討在不同場景下的插入、查找、刪除等操作的性能差異。你將學會如何根據具體需求,選擇最適閤的數據結構,避免不必要的性能損耗。 更高效的數據結構: 除瞭內置數據結構,我們還將介紹一些專門為性能優化的第三方庫,例如`collections`模塊中的`deque`、`Counter`、`OrderedDict`,以及`array`模塊等,它們在特定場景下能提供遠超標準庫的性能。 算法優化實踐: 本部分將不止步於理論,而是通過具體的實例,講解如何將抽象的算法概念轉化為高效的Python代碼。我們將探討一些常見的算法優化技巧,例如記憶化(memoization)、動態規劃(dynamic programming)的Python實現,以及如何利用生成器(generator)和迭代器(iterator)來處理大數據集,從而降低內存消耗。 第三部分:並發與並行——釋放CPU潛能 對於需要處理大量 I/O 密集型任務或 CPU 密集型任務的應用,並發和並行是提升性能的關鍵。本部分將為你揭示Python中的並發與並行技術,並指導你如何正確地運用它們。 綫程(Threads)與全局解釋器鎖(GIL): 我們將深入理解Python的全局解釋器鎖(GIL),它對多綫程的CPU密集型任務有何限製。我們將學習如何在GIL環境下,有效地利用多綫程處理 I/O 密集型任務,例如網絡請求、文件讀寫等,以及如何規避GIL帶來的性能陷阱。 多進程(Multiprocessing): 當CPU密集型任務成為瓶頸時,多進程是繞過GIL的有效手段。我們將詳細介紹`multiprocessing`模塊,學習如何創建和管理進程,以及如何進行進程間的通信與同步,從而充分利用多核CPU的計算能力。 異步編程(Asyncio): 隨著異步I/O模型的普及,`asyncio`成為瞭處理高並發I/O密集型任務的利器。我們將講解協程(coroutines)、事件循環(event loop)的概念,學習如何編寫高效的異步代碼,實現高吞吐量的網絡服務和數據處理。 選擇閤適的並發模型: 本部分將幫助你理解綫程、進程和異步編程各自的優缺點,以及在不同應用場景下,如何選擇最閤適的並發模型,以達到最佳的性能和資源利用率。 第四部分:內存管理與優化 內存是有限的寶貴資源,高效的內存管理對於提升程序性能至關重要。本部分將帶領你深入理解Python的內存分配和迴收機製,並提供實用的內存優化技巧。 Python的內存分配與迴收: 我們將探討Python對象的內存錶示,理解對象的創建、引用計數以及垃圾迴收器的工作原理。通過對這些機製的深入理解,你將能夠寫齣更省內存的代碼。 減少內存占用的策略: 我們將學習多種減少內存占用的技巧,例如使用生成器代替列錶來處理大數據集,選擇更緊湊的數據結構,以及如何有效地釋放不再使用的對象。 內存剖析與調試: 類似於CPU性能剖析,我們也將介紹用於內存分析的工具,如`memory_profiler`和`objgraph`,幫助你定位內存泄漏和高內存占用的代碼段。 第五部分:加速Python:與底層語言的融閤 當Python本身的優化已經無法滿足需求時,我們可以考慮與C/C++等底層語言結閤,將性能敏感的部分用更快的語言實現。 Cython: Cython是一種靜態類型語言,可以編譯成C語言代碼,從而顯著提高Python代碼的執行速度。我們將學習如何使用Cython編寫高性能的Python擴展模塊,並將其與現有的Python代碼無縫集成。 ctypes: `ctypes`庫允許Python直接調用C語言編譯生成的動態鏈接庫(DLLs/SOs)。我們將學習如何使用`ctypes`來加載C函數,傳遞數據類型,從而復用現有的C/C++庫,或實現高性能的計算密集型任務。 SWIG 和 CFFI: 作為其他常用的接口生成工具,我們也將在書中簡要介紹SWIG和CFFI,為你提供更多將Python與C/C++集成的選擇。 第六部分:進階性能優化實戰 在本部分的最後,我們將通過一係列實際的案例,將前麵所學的知識融會貫通,展示如何在真實場景中進行Python性能優化。 Web框架性能優化: 針對Django、Flask等流行的Python Web框架,我們將探討如何優化數據庫查詢、緩存策略、請求處理流程,以構建高性能的Web應用。 數據科學與機器學習性能調優: 對於NumPy、Pandas、Scikit-learn等數據科學庫,我們將講解如何利用矢量化操作、並行計算、內存優化等技術,加速數據預處理、特徵工程和模型訓練過程。 網絡編程性能提升: 我們將關注如何通過異步I/O、連接池、高效的數據序列化等技術,提升網絡服務的吞吐量和響應速度。 本書的特色 理論與實踐相結閤: 本書不僅深入淺齣地講解Python性能優化的核心理論,更提供瞭大量貼近實際的編程示例和代碼片段,讓讀者能夠快速上手並解決實際問題。 循序漸進的學習路徑: 從理解Python底層機製,到數據結構與算法優化,再到並發並行和與底層語言的融閤,本書的學習路徑循序漸進,適閤不同程度的開發者。 強調動手實踐: 鼓勵讀者通過修改和運行書中的代碼示例,親自體驗性能優化的效果,加深對知識的理解。 麵嚮未來: 關注Python最新的性能優化技術和發展趨勢,幫助讀者掌握麵嚮未來的編程能力。 結語 在瞬息萬變的數字時代,軟件性能是用戶體驗和商業競爭力的重要基石。《Python高性能編程》將是你掌握Python性能優化技術的強大助力,它將賦能你構建更快速、更高效、更具競爭力的Python應用程序。無論你是希望優化現有項目,還是渴望在新的技術浪潮中脫穎而齣,本書都將為你提供寶貴的指導和堅實的基礎。讓我們一起踏上這場Python性能優化的探索之旅吧!