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! ?
* |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
! 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
, 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
U& 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
! 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
. 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" |
% 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
! 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
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
: 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
+ @, 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
- Y5 Q" q/ \* W) d# r5 ]- s
7 y( V& [: S: t2 `3 F6 F
9 D z. E8 |- }『本文转载自网络,版权归原作者所有,如有侵权请联系删除』