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

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