Python資料預處理:Dask和Numba並行化加速!
如果你善於使用Pandas變換資料、建立特徵以及清洗資料等,那麼你就能夠輕鬆地使用Dask和Numba並行加速你的工作。單純從速度上比較,Dask完勝Python,而Numba打敗Dask,那麼Numba+Dask基本上算是無敵的存在。
將數值計算分成Numba sub-function和使用Dask map_partition+apply,而不是使用Pandas。對於100萬行資料,使用Pandas方法和混合數值計算建立新特徵的速度比使用Numba+Dask方法的速度要慢許多倍。
Python:60.9x | Dask:8.4x | Numba:5.8x |Numba+Dask:1x
作為舊金山大學的一名資料科學碩士,會經常跟資料打交道。使用Apply函式是我用來建立新特徵或清理資料的眾多技巧之一。現在,我只是一名資料科學家,而不是電腦科學方面的專家,但我是一個喜歡搗鼓並使得程式碼執行更快的程式設計師。現在,我將會分享我在並行應用上的經驗。
大多Python愛好者可能瞭解Python實現的全域性直譯器鎖(GIL),GIL會佔用計算機中所有的CPU效能。更糟糕的是,我們主要的資料處理包,比如Pandas,很少能實現並行處理程式碼。
Apply函式vs Multiprocessing.map
Tidyverse已經為處理資料做了一些美好的事情,Plyr是我最喜愛的資料包之一,它允許R語言使用者輕鬆地並行化他們的資料應用。Hadley Wickham說過:
“plyr是一套處理一組問題的工具:需要把一個大的資料結構分解成一些均勻的資料塊,之後對每一資料塊應用一個函式,最後將所有結果組合在一起。”
對於Python而言,我希望有類似於plyr這樣的資料包可供使用。然而,目前這樣的資料包還不存在,但我可以使用並行資料包構成一個簡單的解決方案。
Dask
之前在Spark上花費了一些時間,因此當我開始使用Dask時,還是比較容易地掌握其重點內容。Dask被設計成能夠在多核CPU上並行處理任務,此外也借鑑了許多Pandas的語法規則。
現在開始本文所舉例子。對於最近的資料挑戰而言,我試圖獲取一個外部資料來源(包含許多地理編碼點),並將其與要分析的一大堆街區相匹配。在計算歐幾里得距離的同時,使用最大啟發式將最大值分配給一個街區。
二者看起來很相似,apply核心語句是map_partitions,最後有一個compute()語句。此外,不得不對npartitions初始化。 分割槽的工作原理就是將Pandas資料幀劃分成塊,對於我的電腦而言,配置是6核-12執行緒,我只需告訴它使用的是12分割槽,Dask就會完成剩下的工作。
接下來,將map_partitions的lambda函式應用於每個分割槽。由於許多資料處理程式碼都是獨立地執行,所以不必過多地擔心這些操作的順序問題。最後,compute()函式告訴Dask來處理剩餘的事情,並把最終計算結果反饋給我。在這裡,compute()呼叫Dask將apply適用於每個分割槽,並使其並行處理。
由於我通過迭代行來生成一個新佇列(特徵),而Dask apply只在列上起作用,因此我沒有使用Dask apply,以下是Dask程式:
由於我是根據一些簡單的線性運算(基本上是勾股定理)對資料進行分類,所以認為使用類似下面的Python程式碼會執行得更快一些。
Broadcasting用以描述Numpy中對兩個形狀不同的矩陣進行數學計算的處理機制。假設我有一個陣列,我會通過迭代並逐個變換每個單元格來改變它
相反,我完全可以跳過for迴圈,並對整個陣列執行操作。Numpy與broadcasting混合使用,用來執行元素智慧乘積(對位相乘)。
Broadcasting可以實現更多的功能,現在看看骨架程式碼:
從本質上講,程式碼的功能是改變陣列。好的一方面是執行很快,甚至能和Dask並行處理速度比較。其次,如果使用的是最基本的Numpy和Python,那麼就可以及時編譯任何函式。壞的一面在於它只適合Numpy和簡單Python語法。我不得不把所有的數值計算從我的函式轉換成子函式,但其計算速度會增加得非常快。
將其一起使用
簡單地使用map_partition()就可以將Numba函式與Dask結合在一起,如果並行操作和broadcasting能夠密切合作以加快執行速度,那麼對於大資料集而言,將會看到其執行速度得到大幅提升。
上面的第一張圖表明,沒有broadcasting的線性計算其表現不佳,並行處理和Dask對速度提升也有效果。此外,可以明顯地發現,Dask和Numba組合的效能優於其它方法。
上面的第二張圖稍微有些複雜,其橫座標是對行數取對數。從第二張圖可以發現,對於1k到10k這樣小的資料集,單獨使用Numba的效能要比聯合使用Numba+Dask的效能更好,儘管在大資料集上Numba+Dask的效能非常好。
優化
為了能夠使用Numba編譯JIT,我重寫了函式以更好地利用broadcasting。之後,重新執行這些函式後發現,平均而言,對於相同的程式碼,JIT的執行速度大約快了24%。
可以肯定的說,一定有進一步的優化方法使得執行速度更快,但目前沒有發現。Dask是一個非常友好的工具,本文使用Dask+Numba實現的最好成果是提升執行速度60倍。如果你知道其它的提升執行速度的技巧,歡迎在留言區分享。
作者資訊
Ernest Kim,舊金山大學碩士生,專注於機器學習、資料科學。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2155744/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [譯] 在 Python 中,如何運用 Dask 資料進行並行資料分析Python並行
- 用Dask並行化特徵工程!並行特徵工程
- (資料科學學習手札150)基於dask對geopandas進行並行加速資料科學並行
- Python資料預處理:徹底理解標準化和歸一化Python
- Java大型資料集合實現並行加速處理幾種方法 - DZoneJava並行
- 資料預處理和特徵工程特徵工程
- 資料預處理
- 使用 Vyper 和 Python 進行自動化登入並處理驗證碼Python
- Python自動化處理Excel資料PythonExcel
- Python資料處理(二):處理 Excel 資料PythonExcel
- 模型訓練:資料預處理和預載入模型
- 資料分析--資料預處理
- 資料預處理-資料清理
- 資料清洗與預處理:使用 Python Pandas 庫Python
- 資料預處理 demo
- 機器學習:探索資料和資料預處理機器學習
- python 處理資料Python
- 資料預處理速度高倍提升,3行python程式碼簡單搞定!Python
- Sklearn之資料預處理——StandardScaler歸一化
- 資料預處理-資料歸約
- 關於使用sklearn進行資料預處理 —— 歸一化/標準化/正則化
- nlp 中文資料預處理
- TANet資料預處理流程
- PyTorch 60 分鐘入門教程:資料並行處理PyTorch並行
- 爬取廣州所有停車場資料(Python)(並行加速版本)Python並行
- 文字資料預處理:sklearn 中 CountVectorizer、TfidfTransformer 和 TfidfVectorizerORM
- Python爬取豆瓣電影的短評資料並進行詞雲分析處理Python
- 並行處理 Parallel Processing並行Parallel
- 資料清洗和資料處理
- 【DL-CV】資料預處理&權重初始化
- 資料預處理方法彙總
- 深度學習--資料預處理深度學習
- 資料預處理(資料清洗)的一般方法及python實現Python
- 60萬行的Excel資料,Python輕鬆處理ExcelPython
- [資料處理]python基礎Python
- Python資料處理典型用法Python
- Python資料處理-pandas用法Python
- 深度學習煉丹-資料預處理和增強深度學習