目錄
安裝動機
最近在用Pandas處理一些大數據集時明顯感受到了Pandas的缺陷:只能使用CPU的一個核心來計算,對於我新買的8核16線程的機子來說,有大量資源都被浪費了。
本着加速Pandas運行的動機,上網搜索了很多能充分利用本地CPU資源的措施,但是看了一些諸如threading
, multiprocessing
之類的庫,還是感覺環境的部署有些難以理解,其中的運用也有一些限制(比如自定義函數必須有返回值),對於像我這樣非CS專業背景的人來說還是不夠友好。最終發現了這個號稱能夠實現一行代碼加速Pandas運行的Modin
庫(事實上也確實如此),鼓搗了一整天之後終於成功實現了Pandas的充分並行加速。
雖然使用起來非常方便,但在安裝過程中走了不少彎路,網上也沒有非常明確的信息指導安裝,因此寫下這篇文章,以免後來者再重蹈覆轍。
Modin庫簡介
Modin 是加州大學伯克利分校 RISELab 的一個早期項目,旨在促進分佈式計算在數據科學領域的應用。它是一個多進程的數據幀(Dataframe)庫,具有與 Pandas 相同的應用程序接口(API),使用戶可以加速他們的 Pandas 工作流。
在一臺 8 核的機器上,用戶只需要修改一行代碼,Modin 就能將 Pandas 查詢任務加速 4 倍。
該系統是爲希望程序運行得更快、伸縮性更好,而無需進行重大代碼更改的 Pandas 用戶設計的。這項工作的最終目標是能夠在雲環境中使用 Pandas。
如果對Modin庫具體的工作流程感興趣,請參考機器之心的知乎文章-想讓pandas運行更快嗎?那就用Modin吧
安裝流程
必須要指出的是,只有Window 10系統才能支持以下的安裝流程
由於Windows環境下並不直接支持Ray,而Ray是安裝Modin所必須的,因此我們需要使用WSL(適用 Linux 的 Windows 子系統),整體的流程也因此比以往pip即可的流程變得複雜了一些
總體來說分爲四步:
-
在Windows設置中調整設置
-
在Windows應用商店中下載Ubuntu
-
配置Ubuntu
-
安裝Modin庫
1. 在Windows設置中調整設置
在控制面板中搜索“功能”
選中後會設置一段時間(約20s),之後會重啓
2. 在Windows應用商店中下載Ubuntu
在Windows應用商店中搜索Ubuntu,安裝。一切按照默認設置即可。
3. 配置Ubuntu
安裝好之後會要求設置用戶名和密碼(這部分忘記截圖了,但是內容也比較少)
用戶名:小寫字母即可。不能設置大寫或下劃線等,會報錯
密碼:密碼是隱形的,所以如果你按下鍵盤之後發現沒有動靜,不要懷疑是卡住了,確保輸入正確後按下回車,會讓你再次輸入確認的
4. 安裝Modin庫
先說說我的安裝方法
因爲我在使用官方方法時遇到了一些問題,但是又沒查詢到解決的方案,所以自己另闢蹊徑,竟然也成功了。
直接打開cmd
,建議掛上VPN,輸入:
pip install modin[all]
就會連Modin帶Ray一起安裝,測試使用時只有很少的情況會無法成功導入,但只要再次嘗試import,通常都會成功(這部分下文細談)
接下來說說官方的方案:
Install Ray with
pip install -U ray
. For the latest wheels (a snapshot of the master branch), you can use the instructions at Latest Snapshots (Nightlies).
也就是在Linux環境中輸入pip install -U ray
安裝Ray,然後再pip install modin
安裝Modin即可
在這裏我出現了一個問題:我的Linux中沒有pip模塊,所以我回到了Windows環境中pip了。
如果沒有pip模塊,應該先安裝pip.exe。接下來的步驟是引用的@a013067506e4在其博客裏的方法,但未經過我的測試:
- 使用以下代碼安裝Ray(這裏加了個豆瓣的源)
pip.exe install -U ray -i https://pypi.doubanio.com/simple/
- 然後再使用以下代碼安裝Modin
pip.exe install modin -i https://pypi.doubanio.com/simple/
Modin庫性能測試
首先導入,非常方便
# 用modin.pandas 代替 pandas,並仍舊命名爲pd
import modin.pandas as pd
import numpy as np
read_csv 測試
CPU配置:AMD R7 4800H(8核)
19.2s。接下來看看普通Pandas的速度
42.8s。使用Modin可以提速一倍以上。
事實上我第一次讀取這個數據集的時候花費時差大概在一分半鐘左右…
fill_na 測試
使用Modin填充空值,需要97.9s
但是使用普通Pandas,只需要1s…
說明modin對於一些函數的支持還是不夠好,甚至比普通的Pandas還慢許多
具體的原因我也沒有理解,所以可以看到modin並非對所有pandas接口都能加速,但如果使用普通接口速度過於慢的時候,換用modin也許是個有益的嘗試。事實上在運行代碼時我也在監視着任務管理器,發現啓動多線程也是需要一些時間的,這意味着,如果數據集不夠大(或者任務量不夠大),多線程帶來的好處可能還不及啓動多線程的時間成本
總結
- 安裝modin比較麻煩,但使用起來很簡單,可以用來作爲pandas運行速度較慢時的加速嘗試
- 根據官方文檔,modin支持約71%的pandas接口,若沒有覆蓋到的接口則會自動使用標準pandas接口(如to_csv)。所以理論上來說,使用modin本應該是個絕對佔優策略
- 但是在實際測試中,發現部分接口的速度還不如用pandas,原因未知。因此終極建議是:先用普通接口,如果所有接口都使用後還是很慢,再使用modin
鳴謝
感謝在我安裝過程中提供支持的三篇博客
- 簡書-windows10下安裝Modin,作者@a013067506e4
- CSDN-mac python3.8使用modin.pandas報錯Please pip install modin[ray] to install compatible Ray version.,作者@大臉猿
- 知乎-pandas升級版——modin,作者 @馬東什麼
最後,感謝我家親愛的@上財李榮浩 大晚上幫我測試了好幾個算法的時間(幫他微博漲粉!)(也可以關注CSDN-上財李榮浩!)