好強一個Julia!CSV數(shù)據(jù)讀取,性能最高多出R、Python 22倍
本文經(jīng)AI新媒體量子位(公眾號ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
工欲善其事,必先利其器。
一項便捷且高效的語言對于數(shù)據(jù)工作者來說是至關(guān)重要的。
目前,數(shù)據(jù)科學(xué)絕大多數(shù)使用的是R、Python、Java、MatLab和SAS。
其中,尤為Python、R的使用最為廣泛。
不過,Julia自2009年出現(xiàn)以來,憑借其速度、性能、易用性及語言的互操性等優(yōu)勢,已然掀起一股全新的浪潮。
最近,便有人使用Julia、Python和R對于CSV讀取速度進行了基準(zhǔn)測試。
其選用來3個不同的CSV解析器:
R的fread、Pandas的read_csv、Julia的CSV.jl
這三者分別在R,Python和Julia中被認(rèn)為是同類CSV解析器中“最佳” 。
之后使用他們分別讀取了8個不同真實數(shù)據(jù)集。
那么,測試的結(jié)果又是如何呢?讓我們來一起看下。
同構(gòu)數(shù)據(jù)集的性能
首先從同構(gòu)數(shù)據(jù)集開始進行性能測試。
性能指標(biāo)是隨著線程數(shù)從1增加到20而加載數(shù)據(jù)集所花費的時間。
由于Pandas不支持多線程,因此報告中的所有數(shù)據(jù)均為單線程的速度。
浮點型數(shù)據(jù)集
第一個數(shù)據(jù)集包含以1000k行和20列排列的浮點值。
Pandas需要232毫秒來加載此文件。
首先在單線程下,data.table(fread)比CSV.jl快1.6倍。
而在使用多線程處理時,CSV.jl則表現(xiàn)得更好,是data.table速度的2倍以上。
單線程CSV.jl是沒有多線程的Pandas(Python)的1.5倍,而多線程的CSV.jl可以達(dá)到11倍。
字符串?dāng)?shù)據(jù)集 I
此數(shù)據(jù)集在且具有1000k行和20列,并且所有列中不存在缺失值。
Pandas需要546毫秒來加載文件。
使用R,添加線程似乎不會導(dǎo)致任何性能提升。
單線程CSV.jl比data.table快2.5倍,而在10個線程中,CSV.jl則大約比data.table快14倍。
字符串?dāng)?shù)據(jù)集 II
該數(shù)據(jù)集的大小與字符串?dāng)?shù)據(jù)集 I 中相同。區(qū)別在于,其每一列是存在缺失值的。
Pandas需要300毫秒。
單線程中,CSV.jl比R快1.2倍,而多線程相比,CSV.jl則快約5倍。
蘋果股價數(shù)據(jù)集
該數(shù)據(jù)集包含50000k行和5列,大小為2.5GB。這些是AAPL股票的開盤價、最高價、最低價和收盤價。價格的四個列是浮點值,并且有一個列是日期。
單線程CSV.jl比從data.table中讀取的R速度快約1.5倍。
而多線程,CSV.jl的速度提高了約22倍!
Pandas的read_csv需要34秒才能讀取,這比R和Julia都要慢。
異構(gòu)數(shù)據(jù)集的性能
接下來是關(guān)于異構(gòu)數(shù)據(jù)集的性能測試。
混合型數(shù)據(jù)集
此數(shù)據(jù)集具有10k行和200列。這些列包含的數(shù)據(jù)值類型有:String,F(xiàn)loat,DateTime、Missing。
Pandas大約需要400毫秒來加載此數(shù)據(jù)集。
單線程中,CSV.jl比R快2倍,而使用10個線程則快了10倍。
按揭貸款風(fēng)險數(shù)據(jù)集
從Kaggle取得的按揭貸款風(fēng)險數(shù)據(jù)集是一種混合型的數(shù)據(jù)集,具有356k行和2190列。這些列是異構(gòu)的,其數(shù)據(jù)值類型有:String、Int、Float、Missing。
Pandas需要119秒才能讀取此數(shù)據(jù)集。
單線程data.table讀取大約比CSV.jl快兩倍。
但是,使用更多線程,Julia的速度與R一樣快或稍快。
寬數(shù)據(jù)集
這是一個相當(dāng)寬的數(shù)據(jù)集,具有1000行和20k列。數(shù)據(jù)集包含的數(shù)據(jù)值類型有:String、Int。
Pandas需要7.3秒才能讀取數(shù)據(jù)集。
在這種情況下,單線程的data.table大約比CSV.jl快5倍。線程的增加,CSV.jl稍慢于R。
房利美收購數(shù)據(jù)集
從房利美網(wǎng)站上下載的數(shù)據(jù)集,有4000k行和25列,數(shù)據(jù)類型為:Int、String、Float,Missing。
單線程data.table比CSV.jl快1.25倍。
但是,隨著線程的增加,CSV.jl的性能不斷提高。CSV.jl的多線程處理速度提高了約4倍。
總結(jié)
縱覽8個測試:
可以看出,在所有八個數(shù)據(jù)集中,Julia的CSV.jl總是比Pandas快,并且在多線程的情況下,它與R的data.table互有競爭。
可見,在CSV讀取方面,Julia完全有能力與Python或和R競爭甚至做得更好。
此外,Julia的CSV.jl是獨特的。
因為它是唯一直接以其高級語言完全實現(xiàn)功能的,這有別于先用C實現(xiàn)然后由R或Python工具進行封裝。
因此,Julia代碼的后續(xù)性能將有著更多的可能。
該項測試原文地址:
https://towardsdatascience.com/the-great-csv-showdown-julia-vs-python-vs-r-aa77376fb96
技術(shù)更新的討論
在Julia,Python和R的測試中,引發(fā)了網(wǎng)友們更多關(guān)于“技術(shù)更新”的熱烈討論。
有些網(wǎng)友對于Julia給予了極大的期待:
在過去的十年中,大多數(shù)生態(tài)系統(tǒng)在Python上都具有巨大的價值,尤其是將MATLAB拋在腦后。
我認(rèn)為從舊技術(shù)過渡到新技術(shù)的十年之久并不是一個糟糕的時標(biāo),甚至沒有接近網(wǎng)絡(luò)技術(shù)的翻版。
Julia對Python進行了足夠的改進,可以保證在接下來的5-10年內(nèi)進行轉(zhuǎn)換,并以相同的方式將Python拋在后面。
不過,也有網(wǎng)友表達(dá)了對“更新重置成本”的擔(dān)憂:
我認(rèn)為Python的生態(tài)系統(tǒng)已經(jīng)成熟,并且在過去的1-2年中已成為標(biāo)準(zhǔn),這具有巨大的價值。
從頭開始使用一種新語言(即使該語言可能稍好一些)會浪費很多精力。從Python2過渡到3已經(jīng)是一場噩夢。
我知道Julia和Python之間存在一些互操作性,但是很多東西是無法互操作的,并且數(shù)組索引等方面存在令人討厭的差異。
人們?yōu)槭裁床荒軆H僅依靠某種技術(shù),使其成熟并享受越來越高的功能?為什么我們總是要撕毀一切并從頭開始?