当前位置:首页 > 语言 > 正文

Python和R的在数据科学中那个好

2019-08-09 10:47 点击:3次 作者:biucz 我来投稿

Norm Matloff是加州大学戴维斯分校的计算机科学教授,他针对数据科学界常年争论的要点,作了一篇关于R和Python的对比分析。

Python和R的在数据科学中那个好

在分析开始之前,Matloff先抛出自己可能带有的潜在偏见:他写过4本与R相关的书,在useR!和其他R的会议上做过演讲,并且目前担任R期刊的主编。但同时他也用Python敲过多年代码。Matloff希望自己的分析能够被认为是公平且有帮助的。

接着,这位专业的计算机科学家和统计学家从以下几方面对R和Python做出了对比:

优雅

Python明显胜出。

当然这是主观的。但是在不同编程语言的对比之下,Python大大减少了括号的使用:

if x>y:

z=5

w=8

vs.

if(x>y)

{

z=5

w=8

}

Python很时尚!

学习曲线

R在这一场赢得巨大胜利。

作为一名教育工作者,Matloff对这一点尤其感兴趣。

若使用Python做数据科学,必须学习很多不在基础Python中的材料,例如NumPy、Pandas和matplotlib。

相比之下,矩阵类型和基本图形已经内置于基础R,新手可以在几分钟内完成简单的数据分析。

即使对于精通系统的人来说,Python库也很难配置,而大多数R软件包都是开箱即用的。

可用的数据科学库

R轻微取胜。

CRAN拥有超过14,000个包。PyPI的包则多于183,000个,不过在数据科学方面看起来似乎比较薄弱。

Matloff举了一个例子:他曾经需要代码来快速计算给定数据点的最近相邻,在CRAN中能够立即找到不止一个包来执行此操作。而在PyPi中粗略搜索后空手而归。

他还指出在PyPI中进行以下搜索没有任何结果:EM算法;对数线性模型;泊松回归;工具变量;空间数据;整体错误率等等。

“这并不是说这些东西不存在Python库。只是在PyPI中不容易找到它们,而在CRAN中很容易找到。”

事实上,R具有规范的封装结构是一个很大的优势。安装新软件包时,确切地知道会出现什么。类似地,R的泛型函数对于R来说也是一大的优势。当使用新的包时,人们知道自己可以使用print()、plot()、summary()等,所有这些都构成了包的“通用语言”。

机器学习

Python略微胜出。

R vs.Python辩论主要是统计与CS的争论,由于神经网络的大多数研究来自CS,因此NN(Neural Network,神经网络)的可用软件主要是Python。RStudio在开发Keras实现方面做了一些出色的工作,但目前为止,R在这个领域受到限制。

另一方面,随机森林研究(random forest research)主要由统计界进行,在这个领域R更具优越性。R还具有优异的梯度增强封装。

这里Python略胜一筹,因为对很多人来说,机器学习就意味着神经网络。

统计正确性

R赢得大胜。

Matloff表示“R是由统计学家为统计学家编写的”。他发现“那些主要使用Python进行机器学习的人往往对其中的统计问题缺乏了解,甚至不屑一顾”。

并行计算

双方打成平手。

R和Python的基础版本都不能很好地支持多核计算。Python中的线程很适合I/O,但由于臭名昭著的Global Interpreter Lock,使用它们进行多核计算是不可能的。Python的多处理软件包和R的“并行”软件包都不是好的解决方法。支持集群计算的外部库在两种语言中都OK。

目前,Python具有更好的GPU接口。

C/C++接口和性能增强

R略胜一筹。

虽然有SWIG等工具可以将Python连接到C/C++,但目前没有像R的Rcpp那样强大的功能。Pybind11软件包正在开发中。

此外,R的新ALTREP理念在提高性能和可用性方面具有巨大潜力。

另一方面,Python的Cython和PyPy变体在某些情况下可以预先消除对显式C/C++接口的需求。确实有人会说Cython是一个C/C++接口。

面向对象,元编程

依然是R略胜一筹。

举例来说,尽管函数在两种语言中都可作为对象,但R比Python更进一步。Matloff说每当自己使用Python工作时,都会因为无法直接将函数输入到终端或编辑它而感到恼火,但在R上就可以这样做。

Python只有一个OOP范例。在R中,可以选择几种(S3、S4、R6等),不过也有些人可能会争论这是否是一件好事。

R有神奇的元编程特性(产生代码的代码),但是大多数CS人都没有意识到它。

语言统一性

R惨败。

Python目前正在从2.7版过渡到3.x版,这会导致一些中断,但不至于太复杂。

相比之下,R正迅速转变为两种相互无法理解的语言,即普通的R和Tidyverse。作为一名经验丰富的R程序员,Matloff表示自己无法阅读Tidy代码,因为它调用了许多他不知道的Tidyverse函数。也有网友评论说“人们可以在对R没什么了解的情况下,在Tidyverse中进行编码”。

关联的数据结构

Python获胜。

经典计算机科学数据结构,例如二叉树,很容易在Python中实现。它不是基础R的一部分,但可以以各种方式完成,例如数据结构包,它包含了使用广泛的Boost C++库。

在线帮助

R大获胜。

首先,R的基本help()函数比Python的信息量大得多。它很好地补充了example()。最重要的是,在R包中能够编写vignette(通过函数vignette()返回,一般是PDF格式的实用介绍性文章)使R在这方面成为了一个不折不扣的赢家。

R/Python互操作性

RStudio开发的reticulate包能够在R上运行Python,可以作为Python和R之间的桥梁,适用于纯计算。但它并没有解决Python中出现的棘手问题,例如虚拟环境等。

目前,Matloff不建议编写混合的Python/R代码。

分析了这么多,最后当然还是要根据实际需求来进行选择,毕竟语言之间没有孰优孰劣。