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個進程而不是一個進程(如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)核都被用上了遇伞,所以加載時間更少辙喂。
對比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那么便捷。