作者 | 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在涉及到变量声明、调用隐式命名的程序、编译代码,然后检讨数据和输出文件方面是多步骤的过程。将矩阵乘法写为AB并立即打印出答案是改变游戏规则的人。
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@D3@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类来充当裁判?这类问题让我心烦意乱。利用多重派发,数据被打包到工具类型中,但是对数据进行操作的方法不会绑定到类。因此:
function detect_collision(B::Ball,W::Wall)
理解类型,但是他们是独立定义, 对我来说,须要花费大量的编程来理解多重派发的观点对付扩展措辞是多么有趣和潜在的主要性。
数字生态系统一贯在迅速发展。我的第一个例子是DifferentialEquations.jl,由令人惊叹的Chris Rackauckas编写。如果这个软件不能立时赢得Wilkinson奖,那么系统就会崩溃。只须要去网站准备转换。
我还没有看到Julia承诺的高于MATLAB的速率提升。部分缘故原由是我相对缺少履历和我所做的任务,但部分缘故原由在于MathWorks在自动化代码方面做了令人难以置信的事情。不管若何,这不是我在大部分韶光关注的编码方面。
利用Julia编程花了一段韶光之后才让我感到舒畅(大概只是我变老了或者固化了)。它让我对数据类型的思考超出我的想象,而且总是潜在疑惑我错过了做某件事的精确办法。但是日常利用中,我现在险些可以转向Julia,作为MATLAB利用。
总而言之
MATLAB是企业办理方案,尤实在用于工程。对付基本数字任务它可能仍旧是最随意马虎学习的。细致的文档和数十年贡献的学习工具绝对主要。
MATLAB是科学打算界的宝马轿车。它是昂贵的,那是在你开始谈配件(工具箱)之前。你要为一个坚如磐石,平稳的性能和做事买单。它也会吸引了不成比例的仇恨。
Python是福特的皮卡。它无处不在,深受许多人(在美国)的喜好。它可以做任何你想做的事,而且它是为做一些其他车辆不能做的事情而设计的。可能你会时时时想借一辆,但它并没有供应非常纯粹的驾驶体验。
Julia是特斯拉,它因此改变未来这一胆大目标而建立,它可能会。它也可能只是一个脚注,但与此同时,你将成功地得到你想要的,并有余力。
你怎么看?
@Hprotagonist:
就我个人而言,MATLAB在涉及到除了那翻转大矩阵之外,都彻底地让我受不了。作为线性代数特定领域工具,我当然更喜好它而不是R,但是作为一个通用工具,它让我想拔出自己的牙齿。
它的设计并不是为了制造可掩护、易于测试和易于重构的流水线工具,而从未如此,它能处理类似“大略明确的字符串和路径操作”这些基本事情,充其量是一个奇怪的仿C、Fortan、Java,且当其他任何措辞当增加这些特性都会风靡一时。
我对MATLAB技能内容或多或少有一点烦恼。(我能忍受一个索引):
size([1])ans = [1 1]
这完备是缺点的,而numpy是精确的:
In[0] np.array([1]).shape Out[0] (1,)
Python实际上是一种通用措辞,具有成熟的科学堆栈,利用它的数值打算我觉得更安全,由于我可以有一个强大的测试套件和命令行输入指向我的代码,这增加了我对我的代码正在做我认为该当做的事的信心,使其易于利用。
打包或多或少是一次***翻转,Python打包是一个巨大的缺点;matlab是不存在的(你必须自己供应每个依赖项)并且价格昂贵(其用户必须为其利用的工具箱付费,以及/或者安装MCR,且不能编辑代码)。
必要时我会掩护matlab,但是我不太喜好它。
@nimrody:
我喜好MATLAB的一个特性是其函数是函数。参数是按值通报的,函数无法修正其参数(嗯,除了可能不常见的工具)。
如果函数不能修正其参数,Matlab将考试测验优化并避免复制。Matlab(有时)也足够聪明,因此A=f(A)会在适当的位置修正A而不是复制。
这便是我对付数学导向措辞的期望。如果可能的话,保持引用透明的假象,然后在内部进行优化。
MATLAB也有合理的JIT编译器,一个很好的调试器。
我不再利用MATLAB,但是它是科学打算(仿照,探索)的一个非常高效的环境。
@ggcdn:
MATLAB有它的独特,但我从来没有碰着过更好的IDE来调试“科学”代码或脚本。通过将鼠标悬停在变量上来查看当前值,能够停息和实行某些“测试”代码,或者重写代码并连续实行,能够轻松编辑类似excel表中的数组或矩阵,当写成代码时,有看起来不像狗屎一样矩阵算法...这些是我认为非常有用的东西。我仅仅由于这些缘故原由在我的领域(构造工程)中利用它,纵然它可能会比较慢,或者更难以完成某些任务。
@ohsonice:
我的(数学研究生院)不雅观点:
出于多种缘故原由,MATLAB在学术界受到推崇。很随意马虎天生可读的小脚本作为教室示例。调试功能/IDE易于导航。学校支付容许费;编译或***包没有任何开销事情(除非你想要做一些炫酷的)。
我参加了用Python教授的ML课程。我所有的数值剖析和建模课程都依赖MATLAB于来做示例和作业。我(作为一个数学界之外的程序员)选择Julia进行研究。现在我做更多的理论研究,由于我不喜好稠浊编码和运算。
一位同学,在FORTRAN平台开拓PDE解算器,导师见告他先让其在MATLAB中事情,然后再转向更快的措辞。
原文:https://tobydriscoll.net/blog/matlab-vs.-julia-vs.-python/
本文为 CSDN 翻译,转载请注明来源出处。
【End】