本文示例程式碼已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
隨著其功能的不斷優化與擴充,pandas
已然成為資料分析領域最受歡迎的工具之一,但其仍然有著一個不容忽視的短板——難以快速處理大型資料集,這是由於pandas
中的工作流往往是建立在單程式的基礎上,使得其只能利用單個處理器核心來實現各種計算操作,這就使得pandas
在處理百萬級、千萬級甚至更大資料量時,出現了明顯的效能瓶頸。
本文要介紹的工具modin
就是一個致力於在改變程式碼量最少的前提下,呼叫起多核計算資源,對pandas
的計算過程進行並行化改造的Python
庫,並且隨著其近期的一系列內容更新,modin
基於Dask
開始對Windows
系統同樣進行了支援,使得我們只需要改變一行程式碼,就可以在所有平臺上獲得部分pandas
功能可觀的計算效率提升。
2 基於modin的pandas運算加速
modin
支援Windows
、Linux
以及Mac
系統,其中Linux
與Mac
平臺版本的modin
工作時可基於並行運算框架Ray
和Dask
,而Windows
平臺版本目前只支援Dask
作為計算後端(因為Ray
沒有Win
版本),安裝起來十分方便,可以用如下3種命令來安裝具有不同後端的modin
:
pip install modin[dask] # 安裝dask後端
pip install modin[ray] # 安裝ray後端(windows不支援)
pip install modin[all] # 推薦方式,自動安裝當前系統支援的所有後端
本文在Win10
系統上演示modin
的功能,執行命令:
pip install modin[all]
成功安裝modin
+dask
之後,在使用modin
時,只需要將我們習慣的import pandas as pd
變更為import modin.pandas as pd
即可,接下來我們來看一下在一些常見功能上,pandas
VSmodin
效能差異情況,首先我們分別使用pandas
和modin
讀入一個大小為1.1G的csv
檔案esea_master_dmg_demos.part1.csv
,來自kaggle
(https://www.kaggle.com/skihikingkevin/csgo-matchmaking-damage/data),記錄了關於熱門遊戲CS:GO
的一些玩家行為資料,因為體積過大,請感興趣的讀者朋友自行去下載:
為了區分他們,在匯入時暫時將modin.pandas
命名為mpd
:
可以看到因為是Win
平臺,所以使用的計算後端為Dask
,首先我們來分別讀入檔案檢視耗時:
藉助jupyter notebook
記錄計算時間的外掛,可以看到原生的pandas
耗時14.8秒,而modin
只用了5.32秒,接著我們再來試試concat
操作:
可以看到在pandas
花了8.78秒才完成任務的情況下,modin
僅用了0.174秒,取得了驚人的效率提升。接下來我們再來執行常見的檢查每列缺失情況的任務:
這時耗時差距雖然不如concat
操作時那麼巨大,也是比較可觀的,但是modin
畢竟是一個處理快速開發迭代階段的工具,其針對pandas
的並行化改造尚未覆蓋全部的功能,譬如分組聚合功能。對於這部分功能,modin
會在執行程式碼時檢查自己是否支援,對於尚未支援的功能modin
會自動切換到pandas
單核後端來執行運算,但由於modin
中組織資料的形式與pandas
不相同,所以中間需要經歷轉換:
這種時候modin
的運算反而會比pandas
慢很多:
因此我對modin
持有的態度是在處理大型資料集時,部分應用場景可以用其替換pandas
,即其已經完成可靠並行化改造的pandas
功能,你可以在官網對應介面(https://modin.readthedocs.io/en/latest/supported_apis/index.html )檢視其已經支援及尚未良好支援的功能,,因為modin
還處於快速開發階段,很多目前無法支援的功能也許未來不久就會被加入modin
:
以上就是本文的全部內容,如有疑問歡迎在評論區與我討論。