Python效能分析與優化(譯者序)

英子發表於2016-06-28

從狹義相對論的角度看,速度最快、規模最大的平行計算方式是太陽照耀地球。每時每刻,陽光都會離開太陽表面,以大約30萬千米/秒的速度,經過8分17秒到達地球表面。太陽的計算方式很簡單,一視同仁,普照大地,並行(parallel)照耀每一個物件,誰也不會多得一米陽光。地球上的每個人都可看成享受陽光資源的獨立程式(process),人們平時處理自己的任務,經歷著各自的生命週期,彼此間有時也會通訊(程式間通訊,IPC)。由於太陽資源豐富,可以不計得失,她也許從來不覺得自己的光具有波粒二象性,也沒覺得平行計算的效率高。

但是,人不是太陽,每個人在一生中時刻面對著諸多問題。“人無遠慮,必有近憂”,本質上皆為時間與空間的稀缺問題,這與計算機的多工處理問題一致。完成任務之前,需要精打細算,以期充分利用資源,儘可能地多快好省,實現高效執行。對於單任務,人們會努力提升自己的能力,並藉助高效能的工具,提高做事的效率,從內部不斷優化自己。對於多個簡單任務,可以完成一個任務再去完成另一個任務,就像for迴圈處理方式。然而,“好漢難敵四手”,個人的力量總是有限的,所以時間緊迫、任務艱鉅時,團隊的力量(多程式)不可或缺。有時,在處理沒有共同資源需求的多個任務時,可以多人同時作業,並行處理,提高效率。處理有共同資源需求的多個任務時,我們會為每個人設定不同的階段性目標,在這段時間做點任務A,在那段時間做點任務B,也就是多執行緒的併發(concurrency)處理;這樣,一段時間後,兩個任務就都可以完成。然而,多程式與多執行緒,究竟哪種方式效率高、效果好,需要根據實際情況決定。

計算機多工處理的理論,與上述情景類似。大師們已經將這些資源配置方法抽象成完整的理論,不僅適用於計算機程式語言,對提高個人素質和改善團隊合作方式也大有裨益。眾所周知,Python語言簡潔優雅的特點,使其生產效率大幅提升,然而在面對海量的資料處理、文字分析、伺服器響應時,其效能瓶頸也十分明顯。但是,Python社群一直在努力,從語言自身的特性到計算機優化理論,特別是多工處理(並行、併發、分散式)等方面,不斷地改善Python的效能。本書即是社群對Python效能分析與優化實踐的系統性總結之一。

本書內容豐富,淺顯易懂,適合有Python基礎的讀者閱讀。作者從演算法效能分析理論開始,首先介紹主流的Python效能分析工具,包括cProfile效能分析器、line_profiler+kernprof效能分析工具、KCacheGrind+pyprof2calltree、RunSnakeRun視覺化效能分析工具,幫助讀者發現程式的效能瓶頸。緊接著,將通用效能優化方法與Python語言結構緊密結合起來,優化程式的效能,介紹了函式值快取、列表生成器、ctypes和字串優化等技巧。之後,介紹了Python多執行緒與多程式的多工處理方法,並對PyPy(JIT編譯器)與Cython(引入C語言型別)的用法與特點進行了深入分析。另外,針對Python在資料分析領域的重要地位,作者還專門介紹了高效能的資料處理程式庫,如Numba、Parakeet和pandas。最後,作者通過一個Python網路爬蟲案例,將前面介紹的效能分析與優化方法結合起來,不斷地改善程式的效能,對比效能優化的效果。

優化Python也是需要成本的。寫Python總是很happy,因為在普通的業務場景中,Python並不慢,再結合成熟的科學計算生態環境,問題大都可以輕鬆解決。雖然Python的效能分析與優化方法都很簡單,但是優化也是需要花費時間的,所以大規模的效能優化需要面對特定的業務場景才有意義,正如不是所有人每天都需要跑100米衝刺,亦如Python的發明者Guido van Rossum所說,“……對絕大多數事情而言,語言效能並不重要……”(...for most of what you're doing, the speed of the language is irrelevant...)。假如你的Python程式總是需要優化,那麼高效能部分程式碼可以考慮使用新語言實現,參考Google與Dropbox的發展軌跡。如果你有時間、想優化,那就動手吧,本書可以給你一些指導。不過,開源專案的發展速度不是書本可以跟上的,所以要想了解最新的進展,需要主動關注相關工具的官方網站或GitHub。書籍能夠提供的是基礎性、系統化的指導,知識可能過時,但方向不會改變。

Python生態系統的效能與時俱進。隨著資料獲取成本與雲端計算資源成本的不斷降低,人們越來越容易獲取強大的計算資源(如亞馬遜AWS、微軟Azure、谷歌雲端計算平臺)。PEP不斷地引入優質方案,增強Python的效能,Spark(支援Python)、dask、IPython的ipyparallel等平行計算框架也在快速發展,Python的生態系統效能不斷地優化,精彩的故事正在進行,讓我們共同努力吧(Let's do more of this)。

簡單,所以持久。

——譯者陶俊傑

相關文章