好强一个Julia!CSV数据读取,性能最高多出R、Python 22倍

工欲善其事,必先利其器。

一项便捷且高效的语言对于数据工作者来说是至关重要的。

目前,数据科学绝大多数使用的是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代码的后续性能将有着更多的可能。

该项测试原文地址:

https://towardsdatascience.com/the-great-csv-showdown-julia-vs-python-vs-r-aa77376fb96

技术更新的讨论

在Julia,Python和R的测试中,引发了网友们更多关于“技术更新”的热烈讨论。

有些网友对于Julia给予了极大的期待:

在过去的十年中,大多数生态系统在Python上都具有巨大的价值,尤其是将MATLAB抛在脑后。

我认为从旧技术过渡到新技术的十年之久并不是一个糟糕的时标,甚至没有接近网络技术的翻版。

Julia对Python进行了足够的改进,可以保证在接下来的5-10年内进行转换,并以相同的方式将Python抛在后面。

不过,也有网友表达了对“更新重置成本”的担忧:

我认为Python的生态系统已经成熟,并且在过去的1-2年中已成为标准,这具有巨大的价值。

从头开始使用一种新语言(即使该语言可能稍好一些)会浪费很多精力。从Python2过渡到3已经是一场噩梦。

我知道Julia和Python之间存在一些互操作性,但是很多东西是无法互操作的,并且数组索引等方面存在令人讨厌的差异。

人们为什么不能仅仅依靠某种技术,使其成熟并享受越来越高的功能?为什么我们总是要撕毁一切并从头开始?

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。

  • 发表于:
  • 原文链接http://news.51cto.com/art/202010/628471.htm
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券