许坤,中国人民大学财政与公共政策研究所,

许文立,安徽大学经济学院,

参考文献

Jon Danielsson, Jia Rong Fan,Which numerical computing language is best: Julia, MATLAB, Python or R?,VOXEU,2018,-numerical-computing-language-best-julia-matlab-python-or-r

Aruoba S B, Fernández-Villaverde J. A comparison of programming languages in macroeconomics[J]. Journal of Economic Dynamics and Control, 2015, 58: 265-273.

Fernández-Villaverde J, Valencia D Z. A Practical Guide to Parallelization in Economics[R]. National Bureau of Economic Research, 2018.

注:图片来源于VOXEU.org

我们已经推送过多期R语言与编程(),---。而且我们推送的DSGE建模与编程入门系列也主要是基于Matlab语言。

现代经济学研究已经越来越依赖于编程语言,就像我们曾经推送过。经济学圈子有一个玩笑:我们是经济学专业,计算机方向的。Danielsson和Fan(2018)指出,经济学研究者最常用的编程语言是Matlab、Python、R,而最近由于Sargent的支持,Julia也越来越被经济学者们用于经济研究与数据分析。

自然出现的问题就是:哪种编程语言最好?

当然,这个问题的答案肯定是仁者见仁智者见智。Danielsson(2011)的“Financial risk forecasting”一书原本是用Matlab和R语言,最近他与Fan一起由更新了Python和Julia版本。因此,他们给出了六个标准来判断哪种编程语言更好。

1、语言的特征

R和Matlab首次开发于20世纪70年代从此以后,它们会不定期的更新版本。

有些R的函数前后不一致,并显示出有问题的结果,正如Burns(2011)在“R Inferno”()所显示的一样。

Matlab也有不合意之处,例如,矩阵存取用相同的括号类型()作为函数调用,这会使得代码读取不便。它们既没有type safe,也没有配置恰当的命名空间,它们的包通常重复使用函数名,从而导致难以诊断的错误。R只支持有限的面向对象编程,而Matlab在2015b升级后才支持面向对象编程。

Python则比上两种编程语言年轻20年。对于数值分析编程,Python最常使用两个包——pandas和NumPy。前一个包是用于数据结构,后一种则是计算。但是,这两个包的数据结构通常不一致。与R和Matlab相比,Python中常用的计算需要调用更长的函数。

Julia则更年轻,正因为如此,它也吸收了上述编程语言的有点。在Julia中,使用者可以有选择性地使用type declarations,而且多线程计算更自然。具有面向对象编程特征, multiple dispatch是其核心特征。

因此,根据语言特征,Julia是最优的。

R、Matlab和Python是演绎语言,因此,它们会发费更多的处理时间。虽然它们现在都可以offer JIT(just-in-time)编译。,但是这并不是总是有所帮助。迭代循环尤其缓慢。

这对于Matlab并不是大问题,因为它被设计用于线性代数,函数功能都是作为用FORTRAN或者C语言编写的数值函数库的前端开放的。R也或多或少类似。但是它们有许多技巧可以提升计算速度。然而,从实施的角度来看,这些技巧又使得它们变得更加复杂。

在Python中,Cython通常被用于提升运行速度。人们也使用Numba。但是它仅仅只能用于某些特别简单的例子。

而Julia则显示了与FORTRAN或C一样快的速度。用户并不用使用其它技巧来提升代码运行速度,因此,这种语言更简单,更容易编程。

Aruoba and JFV(2015)也比较了不同编程语言的速度。

3、数据处理

实现数据通常有多种格式,例如,text files, CSV files, Excel, SQL databases, noSQL databases and proprietary data formats。

R在这方面是绝对的领先。它就是被设计来处理科学数据。它能处理许多种格式和来源、不同数据结构的复杂数据。而且包非常丰富。而且它还能处理超过内存的数据集。

Python在这方面表现也很出色。使用pandas和NumPy包可以处理许多数据,而且还包括一些R做不了的事情。但是它没有R那么灵活,NumPy数组没有列名称。数值分析编程要求迅速有效的重构和改变数据结构中的元素。而使用pandas来做这项工作则需要特殊的命令。

Matlab在最近的更新中已经极大的改进了数据类型的适用性。

Julia在这个方面则表现不佳。相关包缺乏。

也就是说,在数据处理方面,Julia最差,R最好。

四种语言都只提供基本的架构,但是许多专业的功能都需要依靠外部包来实现。

Matlab就是被设计用于数值分析,它内嵌了许多有用的函数。其包非常丰富,尤其用于工程应用方面的包很多。

R包更多:它几乎可以使用所有的统计函数。其缺点在于有些包的质量很差,说明文档不够友好,还可能有多个包实现相同的功能,而输出的类型又不一致。

Python也有许多包可用,但是和R与Matlab无法相提并论。

Julia的包则更少。

但是Python,Julia和R的可以相互调用函数,因此,这可以在某种程度上消除Python和Julia包少的问题。但是这也只是用于某些特殊的情形。

5、授权许可

R、Python和Julia都是开源的,而Matlab则是收费的。这就意味着,前三种编程语言可以在任何平台,任何人都可以安装使用它们。

而且数值计算编程工具箱的费用较为昂贵。例如JFV就在他的并行计算文章中比较了各种并行计算工具箱的价格。

从这个角度来看,Matlab最差。

6、易用性

Matlab拥有非常nice的集成开发环境(IDE),Matlab桌面。

R也有很大的进展,带有Rstudio IDE,甚至比Matlab更好一些。Shiny允许交互式网页应用和界面嵌入R中,因此,提供了联网式的数据呈现形式。R的作图功能强大。

Python的Anaconda也是一个很不错的IDE。作图主要通过Matplotlib来实现,与Matlab的界面类似。

Julia的IDE是Juno。

因此,从这个角度来看,Matlab是最好的,Julia有待发展。