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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖最后由 fish1352 于 2020-10-14 13:32 编辑# A' O3 L, V1 T5 o# f

7 _$ k7 N8 G8 |- X

( d- D! h. A' r; V$ \+ j

. S2 e) C: j" r4 U! [7 m: E

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

; Y$ L2 P9 i, ~; J% U! g" m7 v+ w4 q/ V" Y* V

一项便捷且高效的语言对于数据工作者来说是至关重要的。1 `' H5 r( N. {: b- T

2 j+ G- T+ d: s; X

目前,数据科学绝大多数使用的是R、Python、Java、MatLab和SAS。

5 C, t# N2 X I& Z7 P* i/ m) b& J$ A

其中,尤为Python、R的使用最为广泛。

5 V$ }) Y/ s+ Z$ ^/ |

5 E0 D/ [- F; G6 H9 C! ?

thread-452782-1-1.html

* |2 I) ~8 @. \1 o8 ?# k1 j2 {5 J y6 D7 w8 g7 r/ u

不过,Julia自2009年出现以来,凭借其速度、性能、易用性及语言的互操性等优势,已然掀起一股全新的浪潮。& t! L* m5 n2 ]* r& ?+ ~9 I

3 d, @+ ~# C1 P0 J

最近,便有人使用Julia、Python和R对于CSV读取速度进行了基准测试。" m8 T' F9 M+ u+ L' c+ _2 ]

* X) ]+ W9 t1 U6 j1 u

其选用来3个不同的CSV解析器:! ]7 S, @* ~( B$ P, k5 c

5 J/ A6 y+ g+ d

R的fread、Pandas的read_csv、Julia的CSV.jl7 s0 ^$ U6 O" `$ w4 E( ?

# v, ?* \- r4 G6 z8 k) n- C

这三者分别在R,Python和Julia中被认为是同类CSV解析器中“最佳” 。

- r/ w4 R$ q5 H: `

; a0 [% x& _2 K/ |& c. ^1 U

之后使用他们分别读取了8个不同真实数据集。( B" e+ ^. J% D: H, Q0 p

& ]6 R6 Z1 I) V A& w

那么,测试的结果又是如何呢?让我们来一起看下。, v/ x8 T# Y! m+ x: D4 n, v5 m

7 E/ d# P- c/ U, L6 m; o同构数据集的性能

, `3 R6 Y6 \# |7 X* n

3 _/ k8 ~) f( a# R* f+ {

首先从同构数据集开始进行性能测试。1 K, b- c0 w* s) K! v4 P( R6 U6 M

$ ?6 y$ `+ ^3 D5 p9 S

性能指标是随着线程数从1增加到20而加载数据集所花费的时间。! t3 g, ~# e4 F. V$ H

3 F' G# O+ [5 O6 @5 Z, F; h4 {# h3 Z

由于Pandas不支持多线程,因此报告中的所有数据均为单线程的速度。

# N8 w. c" ^+ x( `9 Q: t

& `! R$ S& n0 E7 {0 b- [浮点型数据集

5 ^( b8 }7 @' f) b/ p& E3 J2 V

6 R5 A" N |3 |/ \

第一个数据集包含以1000k行和20列排列的浮点值。, s' U* n- Z8 g, b1 O% a4 l

/ P5 P3 k" ]3 f! F

thread-452782-1-1.html

! h8 L/ ?3 \3 Q7 w# j9 `. {

4 u7 V( U$ e4 r+ L

Pandas需要232毫秒来加载此文件。! V0 K2 m3 s7 _! Z

' c+ ?7 I& M; x

首先在单线程下,data.table(fread)比CSV.jl快1.6倍。

' I% A' v+ T$ n" ^) Y4 ^% z" s1 L3 H- x/ H

而在使用多线程处理时,CSV.jl则表现得更好,是data.table速度的2倍以上。5 _& q6 ?& b$ ^- x

+ q5 E: x$ j& v, f5 r

单线程CSV.jl是没有多线程的Pandas(Python)的1.5倍,而多线程的CSV.jl可以达到11倍。

; Z7 p$ Z2 h" ~. a

1 r& k3 v$ c0 x( E0 @- V3 {; _; W字符串数据集 I$ r% e; F9 `+ H. w( G9 i+ M0 E

; Y# i* d5 U( _8 o0 w

此数据集在且具有1000k行和20列,并且所有列中不存在缺失值。

# r( ]4 Y. ?* T$ U

% u. r* g' Z7 c3 D* J

thread-452782-1-1.html, l4 O( w( F6 `; c" K

: Q, ^0 H; a+ v3 l

Pandas需要546毫秒来加载文件。

9 g4 U" g" B& d6 r' O: ~4 i0 K8 g, c) u; r3 X; c- ^

使用R,添加线程似乎不会导致任何性能提升。

& ?, h @) A# O! [; U6 ^. Y9 m" M0 F2 G: U( {

单线程CSV.jl比data.table快2.5倍,而在10个线程中,CSV.jl则大约比data.table快14倍。# K/ T$ ~; [/ V& @

* c6 g. u# }8 M" f% U字符串数据集 IIh8 x7 O) `6 c8 O- G: ~5 N

( t% R: g* | m- T+ }1 R5 C

该数据集的大小与字符串数据集 I 中相同。区别在于,其每一列是存在缺失值的。

2 P1 S6 D3 ]% w

. d( o1 J5 Z3 g3 W8 q

thread-452782-1-1.htmlU& O( C c. O" L: y/ H

. V5 w' A H2 a' z

Pandas需要300毫秒。0 z( M3 G0 p6 n

3 m3 k5 U6 h% ?9 U8 u8 o, ?

单线程中,CSV.jl比R快1.2倍,而多线程相比,CSV.jl则快约5倍。

: W: H* G1 }% }5 Q( i0 H5 `; R' q+ \: |' q# A6 K0 z

苹果股价数据集

6 m8 M9 U8 K. M

# y- R* g4 W) J( h

该数据集包含50000k行和5列,大小为2.5GB。这些是AAPL股票的开盘价、最高价、最低价和收盘价。价格的四个列是浮点值,并且有一个列是日期。" @9 M4 R7 Z( v S- [ w7 U+ {

3 F1 {/ O# K# Q) M

thread-452782-1-1.html! M$ M+ f$ P( E* P

: K( z/ Z4 C$ v5 q* m5 E5 F& j

单线程CSV.jl比从data.table中读取的R速度快约1.5倍。

8 m) x3 f. i6 s _4 T! e9 z& f6 `* C/ ?( t0 r# [- W" o

而多线程,CSV.jl的速度提高了约22倍!, ?( j4 p9 s& A

. ?' k/ t7 ]0 b" Y S

Pandas的read_csv需要34秒才能读取,这比R和Julia都要慢。& ] `8 Z6 d1 }

2 g: Y; m+ k; D7 z. \/ T" ^异构数据集的性能

5 D* B/ U U5 D7 d U5 Q- ?3 b' y, f* G3 u# o: U! r- v: v8 Z* D

接下来是关于异构数据集的性能测试。

2 F" `. a4 O( e: l

u( e: O5 \1 \ E混合型数据集

8 O6 V! a4 I. n7 ~. A7 c9 m8 p5 `, w$ c( P

此数据集具有10k行和200列。这些列包含的数据值类型有:String,Float,DateTime、Missing。6 Q# E% t7 e2 a; D& S

# U: f& i6 W/ W8 ^& B6 B! I

thread-452782-1-1.html. w: Q& M9 m, `% m/ i/ I3 j

+ I7 q! T( i- ^/ _* O& f/ _

Pandas大约需要400毫秒来加载此数据集。

* p; j6 G" @# ~* @$ d

8 v6 V3 P0 K8 B4 l

单线程中,CSV.jl比R快2倍,而使用10个线程则快了10倍。

. g6 x( [% v- o3 ]) v1 K/ n. r% x, c$ Y7 G

按揭贷款风险数据集. N: [2 L0 X+ Z( |2 G+ ]0 D

6 L, U) V. p2 f2 C( a' Q

从Kaggle取得的按揭贷款风险数据集是一种混合型的数据集,具有356k行和2190列。这些列是异构的,其数据值类型有:String、Int、Float、Missing。

' V' z0 m/ K# V. o

3 _" M) t$ O1 {$ P" |

thread-452782-1-1.html% q; z# Q$ M( Z8 Z

* L3 w' O# ~; P7 B' M- f. ^

Pandas需要119秒才能读取此数据集。" L/ F, M4 N4 e0 |

6 R( p9 p8 [. B7 _

单线程data.table读取大约比CSV.jl快两倍。

: o) V( x( o; u. T7 P$ i( |, z3 W& C$ {# F& x! N; j% Y

但是,使用更多线程,Julia的速度与R一样快或稍快。+ {; u1 ~; \0 b4 L/ i, K% i# P

$ R& \# M1 l3 {. B5 u% N4 Q; Z

宽数据集, D0 J, ?7 @+ R) a" t& [6 i

" U% [) c9 `! I3 D9 @) j5 ]+ B

这是一个相当宽的数据集,具有1000行和20k列。数据集包含的数据值类型有:String、Int。

; I, Y9 J8 g: \; o/ Z) t$ U1 At; X& f. n' e9 [3 |( R

thread-452782-1-1.html! C9 ?$ Z5 U4 U5 a: C) l; H( x, b$ ~5 Q

/ z/ S4 p& B+ ^, `6 a8 T3 X- R

Pandas需要7.3秒才能读取数据集。

8 l: A1 s7 y$ d/ r7 I

; G* s# P, b/ X$ ^& u; c( v

在这种情况下,单线程的data.table大约比CSV.jl快5倍。线程的增加,CSV.jl稍慢于R。

4 G3 c9 X8 x5 G; I Z# _3 X* V& `

房利美收购数据集/ _3 c6 E% ?8 D8 n6 r2 @

+ u$ u' v( Z, d; I* ~% ]5 j3 l

从房利美网站上下载的数据集,有4000k行和25列,数据类型为:Int、String、Float,Missing。

1 ?6 {" t0 \8 ]# ^3 l/ e( h: A O8 a

thread-452782-1-1.html

2 t+ S; N+ u- @, ]

, e8 a8 H5 G) f

单线程data.table比CSV.jl快1.25倍。; E' ]$ y' @5 }* p# D" B1 t3 q

6 ]0 `4 B1 ^& G& b( i `

但是,随着线程的增加,CSV.jl的性能不断提高。CSV.jl的多线程处理速度提高了约4倍。7 u1 c( Y6 K. p. L5 ~* ]* a

# e& g0 n' h5 O% T9 c R

总结9 l* e/ L6 w% b) ~7 Y% o1 w- n u

: ~( d% P9 }" `; Z( _

纵览8个测试:8 M4 R+ X+ g0 R' T X

' i- F0 J! x w7 z* S, G' S; v1 Q+ b

thread-452782-1-1.html: q6 N9 q9 c; f! L* F: Y8 P) K2 V

; d$ c# `% g p# |' ~

可以看出,在所有八个数据集中,Julia的CSV.jl总是比Pandas快,并且在多线程的情况下,它与R的data.table互有竞争。3 Z3 d* m5 V+ Z/ n

9 _3 e4 e! Z* U) k8 x& i" W' o- O# [

可见,在CSV读取方面,Julia完全有能力与Python或和R竞争甚至做得更好。

0 t4 @' V" t" k/ r/ m" D+ t* Z

. |: W& e% [" k. Z* l$ o

此外,Julia的CSV.jl是独特的。; e' v4 v3 F$ R1 A1 Y1 \9 w: k

) h6 V4 e5 r; {

因为它是唯一直接以其高级语言完全实现功能的,这有别于先用C实现然后由R或Python工具进行封装。

- }7 r; ^$ M& z9 D- r' G& ~3 `# O! A. ~( I

因此,Julia代码的后续性能将有着更多的可能。# R# P$ ]6 f5 A7 a

& n8 R" D1 t6 M) T3 w6 C+ s

该项测试原文地址:, W& c$ t6 o! L6 P( u

* _/ ~9 H( k6 O- u

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

4 p' b1 s7 |# D0 r! c# i- a. g; c- j6 M* B+ `/ p) P) Q技术更新的讨论

在Julia,Python和R的测试中,引发了网友们更多关于“技术更新”的热烈讨论。, ?! [, X* U( f; d. R

. _2 S# q+ K; n: C

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

- `/ Q, F I% c5 D, r) @% Y5 [

8 o& ~" b( G+ v+ m1 X' f在过去的十年中,大多数生态系统在Python上都具有巨大的价值,尤其是将MATLAB抛在脑后。

! l' }: y- ~8 n4 a# ^8 k& g1 _" H9 P2 d1 G" G

我认为从旧技术过渡到新技术的十年之久并不是一个糟糕的时标,甚至没有接近网络技术的翻版。" U- s; h" ?2 e' Z2 q/ j- W

$ U5 e2 Y' O5 L& RJulia对Python进行了足够的改进,可以保证在接下来的5-10年内进行转换,并以相同的方式将Python抛在后面。

. ~2 E7 i$ Z* b O; e2 L5 N7 m

' ~9 D" A- S+ J) i. [4 X+ P5 z) t1 r

thread-452782-1-1.html+ @, I+ L' X, P6 L

: J; F1 X* b4 E( z7 C3 N

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

% z( c9 W( x' `$ S3 \% H5 A# P$ B- p& n

我认为Python的生态系统已经成熟,并且在过去的1-2年中已成为标准,这具有巨大的价值。& f3 [+ j$ v, z1 S( h$ h

/ c& n/ y ~& S( v5 @7 r! @# d从头开始使用一种新语言(即使该语言可能稍好一些)会浪费很多精力。从Python2过渡到3已经是一场噩梦。

; k. |/ a4 e* l# A, L+ g' d; g3 t0 ?: \4 v C% y( `

我知道Julia和Python之间存在一些互操作性,但是很多东西是无法互操作的,并且数组索引等方面存在令人讨厌的差异。* o, S& z/ R4 W% t7 q6 r

& M/ Y" q3 i$ `; s人们为什么不能仅仅依靠某种技术,使其成熟并享受越来越高的功能?为什么我们总是要撕毁一切并从头开始?

1 P( d4 [( ^2 d* h2 ^4 l1 R

I: g5 L+ c1 Q5 w( S

thread-452782-1-1.html

- Y5 Q" q/ \* W) d# r5 ]- s

7 y( V& [: S: t2 `3 F6 F

9 D z. E8 |- }『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值