Python語(yǔ)言是一種腳本語(yǔ)言,其應(yīng)用領(lǐng)域非常廣泛,包括數(shù)據(jù)分析、自然語(yǔ)言處理、機(jī)器學(xué)習(xí)、科學(xué)計(jì)算、推薦系統(tǒng)構(gòu)建等。 本書(shū)共有12章,圍繞如何進(jìn)行代碼優(yōu)化和加快實(shí)際應(yīng)用的運(yùn)行速度進(jìn)行詳細(xì)講解。本書(shū)主要包含以下主題:計(jì)算機(jī)內(nèi)部結(jié)構(gòu)的背景知識(shí)、列表和元組、字典和集合、迭代器和生成器、矩陣和矢量計(jì)算、并發(fā)、集群和工作隊(duì)列等。后,通過(guò)一系列真實(shí)案例展現(xiàn)了在應(yīng)用場(chǎng)景中需要注意的問(wèn)題。 本書(shū)適合初級(jí)和中級(jí)Python程序員、有一定Python語(yǔ)言基礎(chǔ)想要得到進(jìn)階和提高的讀者閱讀。
Python代碼僅僅能夠正確運(yùn)行還不夠,你需要讓它運(yùn)行得更快。通過(guò)探索設(shè)計(jì)決策背后的基礎(chǔ)理論,本書(shū)幫助你更加深刻地理解Python的實(shí)現(xiàn)。你將學(xué)習(xí)如何找到性能瓶頸,以及如何在大數(shù)據(jù)量的程序中顯著加快代碼。 如何利用多核架構(gòu)或集群的優(yōu)點(diǎn)?如何構(gòu)建一個(gè)在不損失性的情況下具備可伸縮性的系統(tǒng)?有經(jīng)驗(yàn)的Python程序員將學(xué)到針對(duì)這些問(wèn)題或者其他問(wèn)題的具體解決方案,以及來(lái)自那些在社交媒體分析、產(chǎn)品化機(jī)器學(xué)習(xí)和其他場(chǎng)景下使用高性能Python編程的公司的成功案例。 通過(guò)閱讀本書(shū),你將能夠: ■ 更好地掌握numpy、Cython和剖析器; ■ 了解Python如何抽象化底層的計(jì)算機(jī)架構(gòu); ■ 使用剖析手段來(lái)尋找CPU時(shí)間和內(nèi)存使用的瓶頸; ■ 通過(guò)選擇合適的數(shù)據(jù)結(jié)構(gòu)來(lái)編寫(xiě)高效的程序 ■ 加速矩陣和矢量計(jì)算; ■ 使用工具把Python編譯成機(jī)器代碼; ■ 管理并發(fā)的多I O和計(jì)算操作; ■ 把多進(jìn)程代碼轉(zhuǎn)換到在本地或者遠(yuǎn)程集群上運(yùn)行; ■ 用更少的內(nèi)存解決大型問(wèn)題。 “ 盡管P y thon在學(xué)術(shù)和工業(yè)領(lǐng)域很流行, 但人們也經(jīng)常由于Python程序運(yùn)行太慢而放棄它。本書(shū)通過(guò)介紹改善優(yōu)化Python計(jì)算速度和可擴(kuò)展性的策略,從而消除人們的這種誤 解。”——Jake VanderPlas 華盛頓大學(xué)
Micha Gorelick在bitly公司從事與數(shù)據(jù)打交道的工作,并負(fù)責(zé)建立了快速前進(jìn)實(shí)驗(yàn)室(Fast Forward Labs),研究從機(jī)器學(xué)習(xí)到高性能流算法領(lǐng)域的問(wèn)題。 Ian Ozsvald是ModelInsight.io的數(shù)據(jù)科學(xué)家和教師,有著超過(guò)十年的Python經(jīng)驗(yàn)。他在yCon和PyData會(huì)議上教授Python編程,這幾年一直在英國(guó)從事關(guān)于數(shù)據(jù)科學(xué)和高性能計(jì)算方面的咨詢工作。
目錄
第1章理解高性能Python1
1.1基本的計(jì)算機(jī)系統(tǒng)1
1.1.1計(jì)算單元2
1.1.2存儲(chǔ)單元5
1.1.3通信層6
1.2將基本的元素組裝到一起8
1.3為什么使用Python12
第2章通過(guò)性能分析找到瓶頸15
2.1高效地分析性能16
2.2Julia集合的介紹17
2.3計(jì)算完整的Julia集合20
2.4計(jì)時(shí)的簡(jiǎn)單方法——打印和修飾24
2.5用UNIX的time命令進(jìn)行簡(jiǎn)單的計(jì)時(shí)27
2.6使用cProfile模塊28
2.7用runsnakerun對(duì)cProfile的輸出進(jìn)行可視化33
2.8用line_profiler進(jìn)行逐行分析34
2.9用memory_profiler診斷內(nèi)存的用量39
2.10用heapy調(diào)查堆上的對(duì)象45
2.11用dowser實(shí)時(shí)畫(huà)出變量的實(shí)例47
2.12用dis模塊檢查CPython字節(jié)碼49
2.13在優(yōu)化期間進(jìn)行單元測(cè)試保持代碼的正確性53
2.14確保性能分析成功的策略56
2.15小結(jié)57
第3章列表和元組58
3.1一個(gè)更有效的搜索61
3.2列表和元組63
3.2.1動(dòng)態(tài)數(shù)組:列表64
3.2.2靜態(tài)數(shù)組:元組67
3.3小結(jié)68
第4章字典和集合69
4.1字典和集合如何工作72
4.1.1插入和獲取73
4.1.2刪除76
4.1.3改變大小76
4.1.4散列函數(shù)和熵76
4.2字典和命名空間80
4.3小結(jié)83
第5章迭代器和生成器84
5.1無(wú)窮數(shù)列的迭代器87
5.2生成器的延遲估值89
5.3小結(jié)93
第6章矩陣和矢量計(jì)算94
6.1問(wèn)題介紹95
6.2Python列表還不夠嗎99
6.3內(nèi)存碎片103
6.3.1理解perf105
6.3.2根據(jù)perf輸出做出抉擇106
6.3.3使用numpy107
6.4用numpy解決擴(kuò)散問(wèn)題110
6.4.1內(nèi)存分配和就地操作113
6.4.2選擇優(yōu)化點(diǎn):找到需要被修正的地方116
6.5numexpr:讓就地操作更快更簡(jiǎn)單120
6.6告誡故事:驗(yàn)證你的“優(yōu)化”(scipy)121
6.7小結(jié)123
第7章編譯成C126
7.1可能獲得哪種類型的速度提升127
7.2JIT和AOT編譯器的對(duì)比129
7.3為什么類型檢查有助代碼更快運(yùn)行129
7.4使用C編譯器130
7.5復(fù)習(xí)Julia集的例子131
7.6Cython131
7.6.1使用Cython編譯純Python版本132
7.6.2Cython注解來(lái)分析代碼塊134
7.6.3增加一些類型注解136
7.7Shed Skin140
7.7.1構(gòu)建擴(kuò)展模塊141
7.7.2內(nèi)存拷貝的開(kāi)銷144
7.8Cython和numpy144
7.9Numba148
7.10Pythran149
7.11PyPy151
7.11.1垃圾收集的差異152
7.11.2運(yùn)行PyPy并安裝模塊152
7.12什么時(shí)候使用每種工具154
7.12.1其他即將出現(xiàn)的項(xiàng)目155
7.12.2一個(gè)圖像處理單元(GPU)的注意點(diǎn)156
7.12.3一個(gè)對(duì)未來(lái)編譯器項(xiàng)目的展望157
7.13外部函數(shù)接口157
7.13.1ctypes158
7.13.2cffi160
7.13.3f2py163
7.13.4CPython模塊166
7.14小結(jié)170
第8章并發(fā)171
8.1異步編程介紹172
8.2串行爬蟲(chóng)175
8.3gevent177
8.4tornado182
8.5AsyncIO185
8.6數(shù)據(jù)庫(kù)的例子188
8.7小結(jié)191
第9章multiprocessing模塊193
9.1multiprocessing模塊綜述196
9.2使用蒙特卡羅方法來(lái)估算Pi198
9.3使用多進(jìn)程和多線程來(lái)估算Pi199
9.3.1使用Python對(duì)象200
9.3.2并行系統(tǒng)中的隨機(jī)數(shù)207
9.3.3使用numpy207
9.4尋找素?cái)?shù)210
9.5使用進(jìn)程間通信來(lái)驗(yàn)證素?cái)?shù)221
9.5.1串行解決方案225
9.5.2Na ve Pool解決方案225
9.5.3Less Na ve Pool解決方案226
9.5.4使用Manager.Value作為一個(gè)標(biāo)記227
9.5.5使用Redis作為一個(gè)標(biāo)記229
9.5.6使用RawValue作為一個(gè)標(biāo)記232
9.5.7使用mmap作為一個(gè)標(biāo)記232
9.5.8使用mmap作為一個(gè)標(biāo)記的終極效果234
9.6用multiprocessing來(lái)共享numpy數(shù)據(jù)236
9.7同步文件和變量訪問(wèn)243
9.7.1文件鎖243
9.7.2給Value加鎖247
9.8小結(jié)249
第10章集群和工作隊(duì)列251
10.1集群的益處252
10.2集群的缺陷253
10.2.1糟糕的集群升級(jí)策略造成華爾街損失4.62億美元254
10.2.2Skype的24小時(shí)全球中斷255
10.3通用的集群設(shè)計(jì)255
10.4怎樣啟動(dòng)一個(gè)集群化的解決方案256
10.5使用集群時(shí)避免痛苦的方法257
10.6三個(gè)集群化解決方案258
10.6.1為簡(jiǎn)單的本地集群使用Parallel Python模塊259
10.6.2使用IPython Parallel來(lái)支持研究260
10.7為魯棒生產(chǎn)集群的NSQ265
10.7.1隊(duì)列265
10.7.2者 訂閱者266
10.7.3分布式素?cái)?shù)計(jì)算器268
10.8看一下其他的集群化工具271
10.9小結(jié)272
第11章使用更少的RAM273
11.1基礎(chǔ)類型的對(duì)象開(kāi)銷高274
11.2理解集合中的RAM使用278
11.3字節(jié)和Unicode的對(duì)比280
11.4高效地在RAM中存儲(chǔ)許多文本281
11.5使用更少RAM的竅門290
11.6概率數(shù)據(jù)結(jié)構(gòu)291
11.6.1使用1字節(jié)的Morris計(jì)數(shù)器來(lái)做近似計(jì)數(shù)292
11.6.2K最小值295
11.6.3布隆過(guò)濾器298
11.6.4LogLog計(jì)數(shù)器303
11.6.5真實(shí)世界的例子307
第12章現(xiàn)場(chǎng)教訓(xùn)311
12.1自適應(yīng)實(shí)驗(yàn)室(Adaptive Lab)的社交媒體分析(SoMA)311
12.1.1自適應(yīng)實(shí)驗(yàn)室(Adaptive Lab)使用的Python312
12.1.2SoMA的設(shè)計(jì)312
12.1.3我們的開(kāi)發(fā)方法論313
12.1.4維護(hù)SoMA313
12.1.5對(duì)工程師同行的建議313
12.2使用RadimRehurek.com讓深度學(xué)習(xí)飛翔314
12.2.1時(shí)機(jī)314
12.2.2優(yōu)化方面的教訓(xùn)316
12.2.3總結(jié)318
12.3在Lyst.com的大規(guī)模產(chǎn)品化的機(jī)器學(xué)習(xí)318
12.3.1Python在Lyst的地位319
12.3.2集群設(shè)計(jì)319
12.3.3在快速前進(jìn)的初創(chuàng)公司中做代碼評(píng)估319
12.3.4構(gòu)建推薦引擎319
12.3.5報(bào)告和監(jiān)控320
12.3.6一些建議320
12.4在Smesh的大規(guī)模社交媒體分析321
12.4.1Python在Smesh中的角色321
12.4.2平臺(tái)321
12.4.3高性能的實(shí)時(shí)字符串匹配322
12.4.4報(bào)告、監(jiān)控、調(diào)試和部署323
12.5PyPy促成了成功的Web和數(shù)據(jù)處理系統(tǒng)324
12.5.1先決條件325
12.5.2數(shù)據(jù)庫(kù)325
12.5.3Web應(yīng)用326
12.5.4OCR和翻譯326
12.5.5任務(wù)分發(fā)和工作者327
12.5.6結(jié)論327
12.6在Lanyrd.com中的任務(wù)隊(duì)列327
12.6.1Python在Lanyrd中的角色328
12.6.2使任務(wù)隊(duì)列變高性能328
12.6.3報(bào)告、監(jiān)控、調(diào)試和部署328
12.6.4對(duì)開(kāi)發(fā)者同行的建議329
非常滿意 推薦大家購(gòu)買
非常滿意 推薦大家購(gòu)買
ok ok