数据科学用 R 还是 Python 好?专业教授多角度分析

xplanet
 xplanet
发布于 2019年08月07日
收藏 42

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

在分析开始之前,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 代码。

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

原文:https://github.com/matloff/R-vs.-Python-for-Data-Science

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:数据科学用 R 还是 Python 好?专业教授多角度分析
加载中

精彩评论

开源中国合格公民
开源中国合格公民
我还是喜欢带括号的
天高云淡_武
花括号更具表达意义,这个多占一两行有什么问题?把回车去掉N多行都能算成一行,PYTHON呢?
流浪汉中写代码最好的
流浪汉中写代码最好的
个人不爱用用缩进来约束格式的,没有好的编辑工具很头疼
阿信sxq
阿信sxq
我还是更喜欢那种用括号表明块的语法,让人一看就懂,或许我不够"时尚"吧😂
GITTODO
GITTODO
从语言设计上上说,R取胜

最新评论(14

三头羊
三头羊
其他地方不知道,在我们山东的初中生,Python是唯一一门划为教学材料的语言
火烧连营救火兵
火烧连营救火兵
事实胜于雄辩,还是看受众多少。
有个地方叫作遥远
有个地方叫作遥远
julia怎么说?
qbmiller
qbmiller
关注挺多啊
开源中国首席美狗
可能是因为数学家更多的是搞数学运算,而不像我们天天码代码所以觉得加括号不优雅?
GITTODO
GITTODO
从语言设计上上说,R取胜
阿信sxq
阿信sxq
我还是更喜欢那种用括号表明块的语法,让人一看就懂,或许我不够"时尚"吧😂
O
OSC_tnbOWw
那些人生苦短我用python的一看就嫌命长,缩进可读性太差了。有的时候你可以靠技巧绕绕,但总有需要你多层缩进的情况。
Keijack
Keijack
所以整洁代码里说不要多层嵌套,其实在 python 里这个规则更具实际意义。
bintwo
bintwo
me too
天高云淡_武
花括号更具表达意义,这个多占一两行有什么问题?把回车去掉N多行都能算成一行,PYTHON呢?
开源中国合格公民
开源中国合格公民
我还是喜欢带括号的
六欧
六欧
不喜欢py的原因只有一个,就是不带括号。每次看代码多了的时候的缩进就要疯。
流浪汉中写代码最好的
流浪汉中写代码最好的
个人不爱用用缩进来约束格式的,没有好的编辑工具很头疼
返回顶部
顶部