木易 发自 凹非寺
量子位 报道 | 公众号 QbitAI
工欲善其事,必先利其器。
一项便捷且高效的语言对于数据工作者来说是至关重要的。
目前,数据科学绝大多数使用的是R、Python、Java、MatLab和SAS。
其中,尤为Python、R的使用最为广泛。
不过,Julia自2009年出现以来,凭借其速度、性能、易用性及语言的互操性等优势,已然掀起一股全新的浪潮。
最近,便有人使用Julia、Python和R对于CSV读取速度进行了基准测试。
其选用来3个不同的CSV解析器:
R的fread、Pandas的read_csv、Julia的CSV.jl
这三者分别在R,Python和Julia中被认为是同类CSV解析器中“最佳” 。
之后使用他们分别读取了8个不同真实数据集。
那么,测试的结果又是如何呢?让我们来一起看下。
同构数据集的性能
首先从同构数据集开始进行性能测试。
性能指标是随着线程数从1增加到20而加载数据集所花费的时间。
由于Pandas不支持多线程,因此报告中的所有数据均为单线程的速度。
浮点型数据集
第一个数据集包含以1000k行和20列排列的浮点值。
Pandas需要232毫秒来加载此文件。
首先在单线程下,data.table(fread)比CSV.jl快1.6倍。
而在使用多线程处理时,CSV.jl则表现得更好,是data.table速度的2倍以上。
单线程CSV.jl是没有多线程的Pandas(Python)的1.5倍,而多线程的CSV.jl可以达到11倍。
字符串数据集 I
此数据集在且具有1000k行和20列,并且所有列中不存在缺失值。
Pandas需要546毫秒来加载文件。
使用R,添加线程似乎不会导致任何性能提升。
单线程CSV.jl比data.table快2.5倍,而在10个线程中,CSV.jl则大约比data.table快14倍。
字符串数据集 II
该数据集的大小与字符串数据集 I 中相同。区别在于,其每一列是存在缺失值的。
Pandas需要300毫秒。
单线程中,CSV.jl比R快1.2倍,而多线程相比,CSV.jl则快约5倍。
苹果股价数据集
该数据集包含50000k行和5列,大小为2.5GB。这些是AAPL股票的开盘价、最高价、最低价和收盘价。价格的四个列是浮点值,并且有一个列是日期。
单线程CSV.jl比从data.table中读取的R速度快约1.5倍。
而多线程,CSV.jl的速度提高了约22倍!
Pandas的read_csv需要34秒才能读取,这比R和Julia都要慢。
异构数据集的性能
接下来是关于异构数据集的性能测试。
混合型数据集
此数据集具有10k行和200列。这些列包含的数据值类型有:String,Float,DateTime、Missing。
Pandas大约需要400毫秒来加载此数据集。
单线程中,CSV.jl比R快2倍,而使用10个线程则快了10倍。
按揭贷款风险数据集
从Kaggle取得的按揭贷款风险数据集是一种混合型的数据集,具有356k行和2190列。这些列是异构的,其数据值类型有:String、Int、Float、Missing。
Pandas需要119秒才能读取此数据集。
单线程data.table读取大约比CSV.jl快两倍。
但是,使用更多线程,Julia的速度与R一样快或稍快。
宽数据集
这是一个相当宽的数据集,具有1000行和20k列。数据集包含的数据值类型有:String、Int。
Pandas需要7.3秒才能读取数据集。
在这种情况下,单线程的data.table大约比CSV.jl快5倍。线程的增加,CSV.jl稍慢于R。
房利美收购数据集
从房利美网站上下载的数据集,有4000k行和25列,数据类型为:Int、String、Float,Missing。
单线程data.table比CSV.jl快1.25倍。
但是,随着线程的增加,CSV.jl的性能不断提高。CSV.jl的多线程处理速度提高了约4倍。
总结
纵览8个测试:
可以看出,在所有八个数据集中,Julia的CSV.jl总是比Pandas快,并且在多线程的情况下,它与R的data.table互有竞争。
可见,在CSV读取方面,Julia完全有能力与Python或和R竞争甚至做得更好。
此外,Julia的CSV.jl是独特的。
因为它是唯一直接以其高级语言完全实现功能的,这有别于先用C实现然后由R或Python工具进行封装。
因此,Julia代码的后续性能将有着更多的可能。