首页 > 科技 >

全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

2019-07-16 07:07:14 暂无 阅读:1301 评论:0

数百种编程说话,各有好坏,各自也都有本身最为适用的场景。那么就科学较量范畴而言,主流的 MATLAB、Julia、Python 会有哪些最为奇特的优势呢?又存在哪些闪开发者无力的缺陷?在本文中,我们将对三者进行周全对比与解析,索求科学较量各个场景中最佳的编程说话。

全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

作者 |Toby Driscoll

出品 | CSDN(ID:CSDNnews)

以下为译文:

我使用MATLAB已经跨越25年了。(在此之前,我甚至使用了MATRIXx,一个末期的,不值得测验的分支,或许或者是一个噱头)这不是我进修编程的第一种说话,然则凭借它我进入数学方式时代,认识MATLAB对我的职业生涯非常有益。

然则,Python的鼓起在科学较量中已经弗成轻忽。MathWorks必然有沟通的感受:它们不光增加了在MATLAB中直接挪用Python的能力,并且还采用了一些说话特征,例如对二元运算符的把持进行更积极广播。

这已经达到了我一向质疑我在研究和教授中持续使用MATLAB的水平。固然大部门对我来说很轻易,并且为此我投入了好多精神,然则很难兴起勇气去真正进修新的器材。

我编写过基于MATLAB的教科书(可作入门较量数学参考书)。这本书有跨越40个函数和160个较量实例,它涵盖了我认为使用MATLAB进行数值科学较量的周全根蒂。部门是为了自我提拔,部门是为了为了增加这本书的实用性。我本年起头将代码翻译成Julia和Python。这一履历使我对关于科学较量方面的三种说话有特别的见解,这就是下面我试图商议的。

我将首要商议成本和开放性问题。与Python和Julia分歧的是,MATLAB既无啤酒自由也无谈吐自由。这对于某些人来说,切实是个伟大的区别,决意性的区别——然则我想考虑手艺优势。多年来,MATLAB以很多非常有效的体式远远跨越了其他任何免费产物,若是你想提高工作效率,那么成本就会受到损害。这是对说话的幻想诉乞降说话生态的零丁考虑。

当你把成本放一边时,这些说话之间有着很多差别的有效框架在于它们的发源。MATLAB是最早测验优先考虑数学,尤其是数字导向数学。Python在20世界80年月末起头卖力,它以较量机科学为中心重点。Julia从2009年起头在这些方面追求更多的均衡。

MATLAB

最初,MATLAB中的每个值都是双精度浮点数数组。这个选择的两个方面,数组和浮点数,都受到设计决议的开导。

用于浮点数的IEEE 754尺度直到1985年才被采用,且内存是用K而不是G来器量的。浮点双精度并不是透露字符或整数最有效的体式,然则它们是科学家、工程师以及越来越多的数学家大多数时候想要使用的。此外,不必声明变量,也不必显式分派内存。让较量机来处理这些义务,并将数据类型抛到一边,解放你得大脑去思虑对数据进行把持的算法。

数组之所以主要,是因为线性代数中的数值算法正以LINPACK和EISPACK的形式显现在本身的数组中。然则科学较量中的尺度承载器FORTRAN 77在涉及到变量声明、挪用隐式定名的法式、编译代码,然后搜检数据和输出文件方面是多步伐的过程。将矩阵乘法写为A*B并立刻打印出谜底是改变游戏划定的人。

MATLAB还使图形变得简洁且易于接见。没有复杂的特定于机械的初级挪用库,仅仅只需要plot(x,y),你几乎就能看到其他任何使用MATLAB的人都邑看到的。MATLAB还有好多立异,例如复杂数字,稀少矩阵,构建跨..图形用户界面的对象,以及一套领先的ODE解算器套件,这些使得MATLAB成为以脑筋速度进行科学较量的处所。

然而,对于交互式较量而言,幻想的设计,即使是冗长的较量,并不老是有助于编写精巧的高机能的软件。在很多函数之间移动数据需要处理大量的变量,并需要频仍查阅有关输入和输出参数的文档。平面定名空间中的每个磁盘文件的一个功能对于一个小项目来说非常简洁,然则对于大型项目来说倒是一个令人头痛的问题。若是你想避免速度瓶颈,则必需应用某些编程模式(矢量化,内存预分派)。科学较量如今被应用于更多的范畴,拥有大量分歧的内陆数据类型。等等。

MathWorks经由持续在MATLAB中进行立异来做出回应:内联函数,嵌套函数,变量闭包,多数据类型,面向对象的特征,单元测试框架等等。每项立异都或者是解决一个主要问题的方式。然则40年改变的储蓄却发生了损坏简洁性和统一性概念的副感化。在2009年,我写了一本书,在不到100页的篇幅里,很好地涵盖了我认为MATLAB的根基内容。据我所知,所有这些依然可用,然则如今你需要认识更多才能称本身是精晓的。

Python

从某种意义上讲,Python的汗青来几乎是MATLAB的镜像,两者都具有交互式号令行(如今被普遍称为REPL,即“real-eval-print loop”),而且不受变量声明和编译的限制。然则MATLAB是作为数值剖析师的游乐场而建立的,而Python则是考虑黑客的情形下建立的。然后经由修订和扩展,每个都向其他受众成长。

在我看来,Python仍然贫乏数学吸引力。你有一些作对和小懊恼,例如对于矩阵乘法用**替代^和@(比来的一项立异),一个shape而不是矩阵巨细,面向行存储等。若是你认为

V.conj().T@D**3@V是一个优雅的写作体式来书写V∗D3V,那么你或者需要看大夫。还有零索引(即与从1起头的索引相反)。我读过这些论点,我认为它们不具有决意性。这显然是一个偏好的问题——收集圣战的内容——因为你能够举出拙笨的例子来解说任何一种商定。我发现决意性的是,我们稀有十年的数学实践索引向量和矩阵,大量伪代码做出了这个假设。

除了这些小懊恼外,我发现Python+NumPy+SciPy生态系统既拙笨且纷歧致。尽管说话首要用于面向对象,但存在一个矩阵类,但它的使用并不鼓励且被弃用。或许MATLAB使我沦落,然则我发现矩阵是一个非常主要的对象类型,能够匡助和提拔。OOP的首要卖点不就是你能够用*来对数组和矩阵能做分歧的事吗?在这方面还有很多不足之处。(为什么我需要一个名为spsovle的号令?我不克在稀少矩阵上挪用solve解决吗?然后持续)。

对我来说,有些处所的数字生态系统看起来有点微弱。例如,正交和ODE(常微分方程)解法在2019年看起来像一个最小鸠合。AFAICT没有方式来解决DAEs,DDEs,没有辛解法,也不许可内部Krylon迭代的隐式较量方式。看看这些方式的参考资料,它们大多30岁或许更老——仍然很好,然则距离完成还很远。Matplotlib包是一个了不得的工作,有一段时间它看起来比MATLAB好,然则发现它仍然贫乏3D。

一些专家认为,对于Python代码在执行速度上很难跟上编译性说话,有着深条理原因。我对搜刮“python太慢了”的究竟感应很高兴,Python的拥护者做了好多以前MATLAB做过沟通的计较和报歉,这并不料味着他们错了,但也不光仅是感知问题。

我想我领略为什么Python对科学较量范畴的很多人来说都是如斯令人兴奋。它有一些MATLAB气势式的语法和功能,能够从REPL获得。它四周有很好的对象,能够很好地与其他说话以及较量范畴合营使用。它免费且具有更好的历久可复用性。很显着,它适用于好多或者没有什么来由去改变的人。

然则对于我知道若何在科学较量中做的事情来说,Python比我习惯的更像一项进修和使用的吃力差事。我们临时还不知道它是否会持续囊括整个社区,或许已经接近巅峰。我没有特别的展望能力,但我对它将来看跌。

Julia

Julia有后来者其长处和瑕玷。我赞赏Julia的创作者认为他们能够做得更好:

我们想要一种具有自由许可的开源说话。进展拥有C的速度和Ruby的天真。我们想要一种同像性说话,有像Lisp如许真正的宏,而又有MATLAB般浅易熟悉的数学符号;我们想要一门像Python一般可用于通用编程、像R般在统计剖析上轻车熟路、像Perl般天然地处理字符串、像MATLAB般具有壮大的线性代数运算能力、像shell般擅长将法式粘合在一路的说话。它简洁易学,却又让严苛的黑客为之倾心;还有,我们进展它是交互式的,同时具备可编译性。

在很大水平上,我相信他们已经取得成功了。在1.0版本的后期,他们似乎稍微淡化了REPL,而且有一些无来由的慢慢远离MATLAB。(LinRange事实比linspace更好吗?)然而,这些都是诡辩。

这是我使用的第一种超越ASCII的说话。经由使用像ϕ的变量,和≈的把持符,我仍然得不到合理的知足感。它不光仅是外观的;可以看起来像我们写的数学表达式是其真正的优势,尽管他的确会使教授和文档变得有点复杂。

使用Julia工作让我感觉我养成了一些编程习惯,是因为MATLAB的选择,而非内涵的优胜性。矢量化对于很多事情并不天然。在Julia中发现,只要在函数名加一个点,你就能够对任何函数矢量化,这一点令人大开眼界。经由练习组织矩阵,比拟之下,使得嵌套轮回(或meshgrid技能)看起来像是马车鞭子,而且经由生成器完全避免矩阵来进行简洁的乞降,感受像没有支付价值就到手了。(我知道Python有雷同的说话特征)。

多重派发这一大特征使得某些事情比面向对象做更轻易和清楚,例如,假设你有传统面向对象说话中的Wall和Ball类,谁人类会检测Ball和Wall之间的辩说?或许你需要一个Room类来充任裁判?这类问题让我心烦意乱。使用多重派发,数据被打包到对象类型中,然则对数据进行把持的方式不会绑定到类。是以:

functiondetect_collision(B::Ball,W::Wall)

认识类型,然则他们是自力界说, 对我来说,需要破费大量的编程来懂得多重派发的概念对于扩展说话是何等有趣和潜在的主要性。

数字生态系统一向在敏捷成长。我的第一个例子是DifferentialEquations.jl,由令人赞叹的Chris Rackauckas编写。若是这个软件不克立时博得Wilkinson奖,那么系统就会溃逃。只需要去网站预备转换。

我还没有看到Julia承诺的高于MATLAB的速度提拔。部门原因是我相对缺乏经验和我所做的义务,但部门原因在于MathWorks在主动化代码方面做了令人难以置信的工作。不管如何,这不是我在大部门时间存眷的编码方面。

使用Julia编程花了一段时间之后才让我感应舒服(或许只是我变老了或许固化了)。它让我对数据类型的思虑超出我的想象,并且老是潜在猜忌我错过了做某件事的准确体式。然则平常使用中,我如今几乎能够转向Julia,作为MATLAB使用。

总而言之

MATLAB是企业解决方案,尤其适用于工程。对于根基数字义务它或者仍然是最轻易进修的。仔细的文档和数十年进献的进修对象绝对主要。

MATLAB是科学较量界的宝马轿车。它是昂贵的,那是在你起头谈配件(对象箱)之前。你要为一个坚如磐石,平稳的机能和办事买单。它也会吸引了不成比例的仇恨。

Python是福特的皮卡。它无处不在,深受很多人(在美国)的喜爱。它能够做任何你想做的事,并且它是为做一些其他车辆不克做的事情而设计的。或者你会时不时想借一辆,但它并没有供应非常纯粹的驾驶体验。

Julia是特斯拉,它是以改变将来这一胆大方针而竖立,它或者会。它也或者只是一个脚注,但与此同时,你将成功地获得你想要的,并有余力。

你怎么看?

相关文章