【Python】Modin,只需一行代碼加速你的Pandas
本文翻譯自:Shrivarsheni的博客
Modin是一個Python第三方庫,可以通過并行來處理大數(shù)據(jù)集。它的語法和pandas非常相似,因其出色的性能,能彌補Pandas在處理大數(shù)據(jù)上的缺陷。
本文會解釋何時該用Modin處理數(shù)據(jù),并給出Modin的一些真實案例。
下文內(nèi)容主要包括:
為什么需要Modin? Modin厲害在哪里? Modin使用方法 對比Modin和Pandas 對比Modin和其他加速庫有何不同?
Modin VS Vaex Modin VS Dask Modin VS cuDF
為什么需要Modin?
Pandas是python數(shù)據(jù)分析最常用的工具庫,數(shù)據(jù)科學(xué)領(lǐng)域的大明星。
Pandas受歡迎的原因在于它簡潔易用的API,并且集成了Numpy、Matplotlib、Scipy等眾多數(shù)據(jù)科學(xué)庫,堪稱Python+SQL+Excel的結(jié)合體。
但Pandas并不是完美的,大數(shù)據(jù)是它的軟肋。
由于設(shè)計原因,Pandas只能在單核上運行,數(shù)據(jù)處理能力有限。目前大部分計算機雖都是多核CPU,Pandas卻心有余而力不足,無法用到多核。
正因為大多人都熟悉了Pandas的語法結(jié)構(gòu),所以想換一種新的數(shù)據(jù)分析庫并不容易,會增加很多的學(xué)習(xí)成本。
如果在保留Pandas語法和API的前提下,又能增加大數(shù)據(jù)處理能力,這將會一個完美的解決方案。
Modin就是這樣一個存在。只要你有使用Pandas的經(jīng)驗,就可以輕松上手Modin。
Modin厲害在哪里?
Modin是一個Python第三方庫,可以彌補Pandas在大數(shù)據(jù)處理上的不足,同時能將代碼速度提高4倍左右。
Modin以Ray或Dask作為后端運行。
?Ray是基于python的并行計算和分布式執(zhí)行引擎。
?
Dask是一個高性能并行分析庫,幫助Pandas、Numpy處理大規(guī)模數(shù)據(jù)。
那Modin有何特別之處呢?
與pandas不同,Modin能使用計算機中所有的CPU內(nèi)核,讓代碼并行計算。
當(dāng)用4個進(jìn)程而不是一個進(jìn)程(如pandas)運行相同的代碼時,所花費的時間會顯著減少。
Modin的主要特點:
使用DataFrame作為基本數(shù)據(jù)類型; 與Pandas高度兼容,語法相似,幾乎不需要額外學(xué)習(xí); 能處理1MB到1TB+的數(shù)據(jù); 使用者不需要知道系統(tǒng)有多少內(nèi)核,也不需要指定如何分配數(shù)據(jù);
Modin使用方法
首先要安裝Modin,使用pip安裝即可。
前面說過,Modin使用Ray或Dask作為后端,在這里我們使用 dask,命令行輸入以下代碼同時安裝Modin和Dask:
pip install modin[dask]

接下來是導(dǎo)入Modin,這是重點。
Modin宣稱改一行代碼就可以加速pandas,只需將:
import pandas as pd
改為
import modin.pandas as pd
除了速度更快外,其他要用的的語法、api和Pandas一模一樣。
我們來試試分別用Modin和pandas讀取200MB的CSV文件,看哪個速度更快。
# 使用pandas讀取數(shù)據(jù)
import pandas as pd
import time
s = time.time()
df = pd.read_csv("test.csv")
e = time.time()
print("Pandas讀取時間 = {}".format(e-s))
# 使用Modin讀取數(shù)據(jù)
import modin.pandas as pd
s = time.time()
df = pd.read_csv("test.csv")
e = time.time()
print("Modin讀取時間 = {}".format(e-s))
返回:
Pandas是3.3秒,Modin是1.9秒,速度快了接近1倍。
我的電腦是4核CPU,Modin加載過程中所有內(nèi)核都被用上了。如果用8核來跑,加載時間更少。
對比Modin和Pandas
read_csv
簡單對比了Modin和Pandas讀取200M文件后,我們再試下讀取1GB的CSV文件有多大差異。
pandas:
# 使用pandas讀取數(shù)據(jù)
import pandas as pd
import time
s = time.time()
df = pd.read_csv("test1.csv")
e = time.time()
print("Pandas讀取時間 = {}".format(e-s))
輸出:
Pandas讀取時間 = 11.298792123794556
# 使用Modin讀取數(shù)據(jù)
import modin.pandas as pd
s = time.time()
df = pd.read_csv("test1.csv")
e = time.time()
print("Modin讀取時間 = {}".format(e-s))
輸出:
Modin讀取時間 = 7.6007184982299805
處理GB級的數(shù)據(jù),Modin的優(yōu)勢也是顯而易見的,當(dāng)然處理時間會隨計算機的不同有差異。
append()
append在Pandas中用來添加新行,我們來看看Modin和Pandas做append操作時的速度差異。
Pandas:
# 使用pandas讀取數(shù)據(jù),200M文件
import pandas as pd
import time
df_pandas = pd.read_csv("test.csv")
s = time.time()
result = df_pandas.append(df_pandas)
e = time.time()
print("Pandas append時間 = {}".format(e-s))
輸出:
Pandas append時間 = 1.242678165435791
Modin:
# 使用Modin讀取數(shù)據(jù),200M文件
import modin.pandas as pd
df_modin = pd.read_csv("test.csv")
s = time.time()
result = df_modin.append(df_modin)
e = time.time()
print("Modin append時間 = {}".format(e-s))
輸出:
Modin append時間 = 0.2613077163696289
Pandas用時1.2秒,Modin用時0.2秒。
Concat()
concat用來拼接多個DataFrame,也來測試一下差異。
Pandas:
# 使用pandas讀取數(shù)據(jù),200M文件
import pandas as pd
import time
df_pandas = pd.read_csv("test.csv")
s = time.time()
result = pd.concat([df_pandas]*5)
e = time.time()
print("Pandas concat時間 = {}".format(e-s))
輸出:
Pandas concat時間 = 3.705094337463379
Modin:
# 使用Modin讀取數(shù)據(jù),200M文件
import modin.pandas as pd
df_modin = pd.read_csv("test.csv")
s = time.time()
result = pd.concat([df_modin]*5)
e = time.time()
print("Modin concat時間 = {}".format(e-s))
輸出:
Modin concat時間 = 0.5255951881408691
Pandas用時3.7秒,Modin用時0.5秒。
通過上面3個函數(shù)的比較,Modin在使用append、concat等方法上要比Pandas快5倍以上
對比Modin和其他加速庫有何不同?
現(xiàn)在有很多庫可以實現(xiàn)對Pandas的加速,比如Dask、Vaex、Ray、CuDF等,Modin和這些庫對比有什么樣的優(yōu)勢呢?
「Modin Vs Vaex」
Modin可以說是Pandas的加速版本,幾乎所有功能通用。
Vaex的核心在于惰性加載,類似spark,但它有獨立的一套語法,使用起來和Pandas差異很大。
如果你已經(jīng)寫好基于pandas的腳本,只是想加速運行代碼,那么Modin是最佳選擇。如果你只是想簡單統(tǒng)計或可視化大數(shù)據(jù)集,可以考慮Vaex。
「Modin Vs Dask」
Dask既可以作為Modin的后端引擎,也能單獨并行處理DataFrame,提高數(shù)據(jù)處理速度。
但Dask對Pandas并沒有很好的兼容性,沒辦法像Modin那樣,只需改變一行代碼,就可以輕松使用Pandas處理大數(shù)據(jù)集。
「Modin vs. RAPIDS (cuDF)」
RAPIDS加速效果非常好,但它需要有GPU的加持,沒有Modin那么便捷。
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
