为什么将Python用于高性能/科学计算(而不是Ruby)?


106

PyCon 2011演讲中有一段话说

至少在我们的商店(阿贡国家实验室)中,我们有三种公认的科学计算语言。按照这种顺序,它们是C / C ++,所有方言的Fortran和Python。您会注意到绝对,完全缺少Ruby,Perl,Java。

它是在更通用的高性能计算环境中。报价仅来自一家商店,但另一个有关HPC语言的问题也将Python列为要学习的语言(而不是Ruby)。

现在,我可以理解在该问题空间中正在使用C / C ++和Fortran(而未使用Perl / Java )。但是令我惊讶的是,鉴于HPC在Python和Ruby中的使用非常相似,因此它们之间会有很大的不同。(注意-我是Python的粉丝,但 Ruby 没有任何帮助)。

有没有一些具体的为什么一种语言起飞的原因吗?关于可用的库吗?一些特定的语言功能?社区?还是仅仅是历史上的偶然性,它本来可以反过来


2
我建议,虽然他们都是动态语言,Python和Ruby是相当不同的。比相似更多不同。
亚当·克罗斯兰

20
我不知道这是一个答案,但是-请记住,在Ruby脱离Rails的一个小社区之外(大约2005-2006年)之前,Python具有更多的“吸引力”。Google使用Python已经有一段时间了,这提高了它的知名度(2000年代初)。Python的语法清晰易懂,易于阅读和阅读(请记住,那时Perl确实是唯一的其他主要选择),所以我认为这确实推动了科学计算的发展。此后,这可能是自我增强,因为人们创建了NumPy / SciPy,MatPlotLib和许多其他科学计算程序包。
wkl 2012年

4
对这个问题感兴趣的人我也有兴趣查看计算科学堆栈交换站点。
Mark Booth

2
“可读性很重要”
jsbueno

1
为了提供一些计算化学的观点,将计算与Python并行化并不容易,而且价格便宜。也许这两个在Ruby中都是正确的。我不知道。
乔纳森·兰德伦

Answers:


108

我将扩大我的评论。

我认为有一些因素影响了Python在科学计算中的使用,尽管我认为没有明确的历史观点可以说:“是的,这就是为什么Python被用于Ruby或其他方面的原因。 ”

早期历史

Python和Ruby年龄大致相同-根据Wikipedia的说法,Python于1991年正式发布,而Ruby于1995年正式发布。

但是,Python的出现要比Ruby早,因为Google已经在使用Python,并在千年之交寻找Python开发人员。既然我们在编程语言的使用及其对使用语言的影响方面没有悠久的历史,我将得出理论,Google对Python的早期采用对于那些希望超越使用Matlab,C ++, Fortran,Stata,Mathematica等

即,我的意思是说Google在一个拥有数千台机器(考虑并行化和扩展)并不断处理数百万个数据点(再次,扩展)的系统中使用Python。

事件汇合

科学计算曾经在SGI和Crays之类的专用机器上完成(还记得吗?),当然,FORTRAN由于相对简单并且可以更轻松地进行优化而被(并且至今)被广泛使用。

在过去的十年左右的时间里,商品硬件(意味着您或我可以成为百万富翁而买不起的东西)已经占领了科学和海量计算领域。查看当前的前500名排名 -世界上排名最高的“超级计算机”都是使用常规的Intel / AMD硬件构建的。

Python进入了一个好时机,因为Google再次推广Python,而Google使用商品硬件,并且他们拥有数千台机器。

另外,如果您研究一些旧的科学计算文章,它们会在2000年左右开始兴起。

早期支持

这是2000年为《天文数据分析软件和系统》撰写的文章,建议使用Python作为科学计算的语言。

本文引用了有关Python的这句话:

Python是一种解释型的面向对象的编程语言,在科学应用程序中已开始受到相当多的关注(Python,1999)。这是因为Python和一般的脚本语言代表了许多科学项目的下一个逻辑步骤(Dubois 1994)。首先,Python提供了一种解释性编程语言,可以将其视为科学程序已经使用的简单命令语言的扩展。

其次,Python易于与用其他语言编写的软件集成。结果,它既可以用作驱动现有程序的控制语言,也可以用作将不同系统组合在一起的粘合语言。最后,Python以书籍和在线参考的形式提供了大量第三方模块,已建立的用户群以及各种文档。由于这个原因,人们可能会认为它是高度精炼和扩展的版本,是科学家在编写自己的命令解释器时经常试图完成的工作。

因此,您可以看到Python早在90年代末就具有吸引力,这是因为它的功能与当时的现有系统相似,并且很容易将Python与C和现有程序集成在一起。根据文章的内容,Python可以追溯到1995-1996年的时间段已投入科学使用。

人气增长差异

Ruby的受欢迎程度随Ruby On Rails的兴起而爆发,Ruby的兴起始于2004年。我在大学的时候,第一次真正听到有关Ruby的嗡嗡声时,那是在2005-2006年。django for Python大约在同一时间发布(根据Wiki,2005年7月),但是Ruby社区的焦点似乎非常集中在促进其在Web应用程序中的使用。

另一方面,Python已经拥有适合科学计算的库:

  • NumPy -NumPy于2005年正式开始,但其建立的两个库较早发布:Numeric(1995)和Numarray(2001?)

  • BioPython -Python的生物计算库,至少可以追溯到2001年

  • SAGE-数学包,于2005年初首次公开发布

还有很多,尽管我不了解他们的很多时间表(除了浏览他们的下载站点之外),但是Python还具有SciPy(基于NumPy构建,于2006年发布),并与R(统计语言)绑定。在2000年代初期,有了MatPlotLib,并且在ipython中也有了一个非常强大的shell环境。

ipython于2000年代初首次发布,并添加了许多功能,使其非常适合科学计算,例如集成的matplotlib图形和能够管理计算集群

从以上文章:

还值得一提的是其他一些与Python相关的科学计算项目。Python的数字扩展为Python添加了快速的数组和矩阵操作(Dubois,1996年),MMTK是基于Python的分子建模工具包(Hinsen,1999年),Biopython项目正在开发基于Python的工具,用于生命科学研究(Biopython,1999年), Visualization Toolkit(VTK)是具有Python绑定的高级可视化软件包(VTK,1999)。另外,Python社区中正在进行的项目正在开发图像处理和绘图的扩展。最后,在(Greenfield,2000)中介绍的工作描述了STScI项目中Python的使用。

Python的科学和数字软件包的清单


因此,很多原因可能是由于其悠久的历史以及直到2000年代Ruby的相对默默无闻,而由于Google的传福音,Python获得了广泛的关注。

因此,如果您在1995年至2000年期间评估脚本语言,那么您真正在看什么?有Perl,其语法在语法上可能已经足够不同,以至于人们不想使用它,然后有Python,它具有更清晰的语法和更好的可读性。

是的,可能有很多自我增强功能-Python已经拥有了所有这些强大而有用的用于科学计算的库,而Ruby则倡导在科学中使用它的少数派声音,并且像SciRuby一样涌现了一些库,但是在过去的十年中,Python的工具已经成熟。

Ruby的整个社区似乎对将Ruby进一步发展为Web语言更加感兴趣,因为这确实使它广为人知,而Python则走了一条不同的道路,后来被广泛用作Web语言。


8
我忘记了有关c集成的知识。在许多情况下,科学计算需要大量计算,并且能够为该位编写ac例程是一个重要的优势。
Spencer Rathbun 2012年

1
@SpencerRathbun我链接的文章提到使用Python和SWIG生成包装器,并允许Python与C / C ++代码互操作。SWIG直到2004年发布的Ruby 1.6才获得正式的Ruby支持。因此,就分享和工具而言,Python已经取得了重大的领先优势,并且围绕它的工具也使人们可以将Python栓接到现有系统中。不必放弃所有正在使用的,优化的FORTRAN / C代码,这可能是最大的推动力。
wkl 2012年

3
1991年,我们使用TCL将数字库连接在一起,从而无需编写大量C / Fortran即可分析数据。Python恰逢其时,以取代TCL。与PERL相比,与C轻松接口(以及通过F2C与fortran进行接口)是一件大事,TCL与C的接口非常简单
Martin Beckett 2012年

优先附件过程对使用的语言有很多解释。是Zipfian!参见Zipf Myatery “ PAP”在12:50进行了解释。
Radarbob

37

我已经广泛地将Python用于工程应用程序,而将Ruby用于Web应用程序。

我将Ruby作为一种科学语言看到的问题是,给定操作的语法选项太多。

Python的设计遵循以下前提:“应该有一种-最好只有一种-显而易见的方式”。这使得阅读某人的代码并确定其意图变得更加容易。这是工程等方面同行评审的关键。

我喜欢Ruby,它对某些任务非常有用,但是我的Ruby代码在语法上可能与完全相同的另一位程序员的代码完全不同。这在科学或工程环境中会引起太多歧义。


3
确实是的。Ruby具有TIMTOWTDI的传统,因此只是Perl稍好一点。软件是为程序员编写的。从这个意义上说,编译器/解释器是次要读者。科学家倾向于认真地完成工作,而不会受到不必要的困难软件的过多干扰。QED
Dominic Cronin

4
不确定我是否遵循此论点。如果程序员而不是机器是主要受众,那么有时候用不同的措词可以提高清晰度并突出意图。更加灵活的语言是否有助于我们柔软的人脑来理解?
安德鲁·维特

10
但是C也看起来像在ASCII工厂一样爆炸。回想一下在C语言中,数组是指针周围的外观。因此,可以将array [5]替换为*(array + 5),可以将其替换为*(5 + array),可以将其替换为5 [array]。这是愚蠢的。
乔纳森·兰德鲁姆

1
我是一个非常长期的perl程序员,对于大多数目的,它仍然是我最喜欢的语言。虽然不确定数学。我不同意TIMTOWTDI方法的这种态度。当然,拥有许多可用的方法并不意味着它们都很好,但是重要的是要能够对您的表达进行定制,以使其清晰,直接地映射到您要表达的想法,无论是对人还是机器的听众。缺乏语法选项无济于事。
mc0e 13-10-18

@AndrewVit:不一定。如果您只有一个开发人员,或者如果您有一个紧密集成的小型开发人员团队,则TIMTOWTDI会非常有用。但只要你有谁从来没有遇到过相同的代码工作的人,你会开始问自己:“哦,为什么他们会做呢?” 或者,或者,您将编写样式指南,以迫使每个人都以相同的方式进行操作,然后您就不再使用TIMTOWTDI。
凯文(Kevin)

17

猜测,其中很大一部分是许多研究人员对matlab的依赖。Python有其他选择,例如sage。红宝石没有,或者至少没有明显的。

其次,根据Ruby FAQ,python既是面向过程的又是面向对象的,而ruby则伪装成一种过程语言。如果您正在编写用于数学目的的小脚本,例如您在matlab中所做的那样,则OO范式令人头疼。不仅如此,它还迫使概念从研究人员使用的功能/过程范例中脱颖而出。数学不是 OO。数学是功能性的,其后是程序性的(认为是逻辑证明)。

最后,请注意,Ruby FAQ指出ruby比python更复杂。编程仅次于研究人员,而不是像我们一样。


22
我认为OO有点让人讨厌。研究人员在乎表达式是否1 + 1将消息发送+给对象1?丝毫不会改变程序的结构。
sepp2k 2012年

1
@ sepp2k,我认为Spencer建议Ruby将要求科学家进行不同的编程。我不了解Ruby,但是假设您必须创建对象才能使用Ruby编写程序,而Python允许使用过程-这会增加工作量。授予的权利不是很多,但是对于非程序员来说,额外的每一工作都是使用另一种语言的原因。
独眼巨人2012年

7
@独眼巨人我明白他的建议。我是说错了 关于将红宝石伪装成一种程序语言的报价的全部要点是,您不需要以面向对象的方式来构造程序。如果键入“ 2 + 2”之类的内容,则将创建两个Integer对象,并在一个对象上调用一个方法(将另一个作为参数传递)。但是,这并不比在其他语言中键入“ 2 + 2”要花费更多的精力。
sepp2k 2012年

5
我支持sepp2k,我也不赞成这种说法。诸如Java之类的某些语言确实在您身上使用了OO模式-Ruby则不是。是什么阻止您使用Ruby编写纯粹的过程或功能程序?
Mike Baranczak 2012年

2
完全是@Cyclops。尽管Ruby可以伪装成过程性的,但是在非平凡的上下文中,您将遇到OO范式使语言以某种方式起作用的情况。如果您不理解或忽略它,那么您要么无法做您想做的事,要么最终会陷入混乱。
Spencer Rathbun 2012年

14

BDFL(Guido van Rossum)首次编写Python时,目标是使其与普通英语(DARPA资助提案)一样易懂,从而消除了常见的编码错误。

一个非常明显的问题是使用缩进来分隔块。在具有显式复杂语句定界符的语言中(例如,C括号,Pascal BEGIN / END),在将代码提供给词法分析器之前,空格将折叠为单个空格字符。这样可以极大地改变代码的布局方式。

对于专业程序员而言,这不是问题,因为他们已经训练了自己,每周练习30个小时或更长时间来处理它。

对于以编程为工具的其他专业人员,此问题成为主要问题。该小组包括数学家,物理学家,化学家,工程师等。

由于Python减少了非专业程序员的错误,因此它使他们能够思考他们要解决的问题,而不必过多地处理语言的技巧。

这是为什么它在编程界之外很流行的一个例子。还有其他示例可以用来说明同一点,例如包括电池,The Zen of Python(import this),使用Monty Python幽默等等。


我在Guido的履历表或出版物列表上找不到任何有关学位论文或博士学位课程的参考。你有被引用吗?这次采访只是说他是CWI的研究员。
M. Dudley 2014年

我完全搞砸了:我读过他所做的只是论文,但没有对此做适当的研究。写完这篇文章后,我发现了自己的错误,但是在这里从未进行过更正。谢谢。
Lance Helsten

5

这是一次很棒的讨论,我认为这里的帖子确实回答了为什么python在科学界更受欢迎。但是,对于红宝石科学有一些反论点:

  • 红宝石可以比python(DSL等)更直观地编码:给定使用的正确软件包:

    检查bioruby:http ://bioruby.org/如果使用数据库,则序列保留可以很简单:s.reverse等:ruby数据库绑定API可以说比python更好。

  • 红宝石在简洁的同时允许更高级别的抽象。

  • 更好的软件包管理系统:与之相比,ruby gems更容易:setuptools,pip等

但是,ruby的采用曾经/现在/将来会因其复杂性而受到阻碍。我认为Lisp是一门强大的语言,但是为什么它没有作为一种通用语言而流行呢?红宝石的情况与此类似-它从lisp,闲聊和perl!继承了很多力量:但是实际上只有少数人会使用它来获得好处。最后,它可能会在某些特定领域/特殊领域(例如网络中的铁路,配置中的人偶)保持强大,“非”程序员很难充分享受它,但它可能是程序员的好朋友(见过一台计算机)科学家喜欢这种语言:http : //www.cleveralgorithms.com/nature-inspired/index.html

最近的一些更新:似乎python已经占领了景观。最近的书籍,例如:http : //www.amazon.com/Python-Data-Analysis-Wes-McKinney/dp/1449319793 和许多其他书籍(数据分析,机器学习等),都是使用python作为语言编写的。如果红宝石想要赶上,那就需要认真的努力。考虑到python中的matplotlib,可能要花几年的时间才能使它达到现在的状态。除非在红宝石上进行一些认真的努力,否则它可能无法在未来2-3年内赶上python数据分析/科学计算的阶段。


3

在使用python进行数据分析一段时间之后(来自使用ruby,lua和R的经验),numpy包(以及许多相关的科学库)使“可能”运行快速计算(速度类似于C,为numpy)是用C代码编写/集成的),并且易于在python中进行编程。

Numpy已经存在了一段时间,它的可用性帮助构建了许多其他相关的科学软件包,例如scipy,pandas等。有强大的工具使python成为科学计算的绝佳生态系统,而在Ruby中,类似的更快的矩阵计算库正在开发中(NMtrix:https : //github.com/SciRuby/nmatrix)。这种巨大的时间差异使python成为科学计算的明显选择。


5
“最后,python就像每个人的语言一样”,您需要提供一个源来支持这一点。
Walter

2

我一直在想同样的事情。正如Spencer Rathbun所说,我认为这是因为Python在程序方面的原因。我自己是一个“非程序员”,我发现使用Ruby进行编码的方式非常漂亮,并且Rails框架非常易于使用。但是,在出于科学目的(数学,生物学等)进行编码时,通常会以“数学”语言进行思考,也就是说,您并不关心诸如

Person.find_by_name 'Juanito'

但是你更关心

A = B*C + D

因此,我认为Ruby强大,它的许多功能都不会在科学程序中使用。只考虑过程就容易了。


0

Python通过Numpy包对N维数组提供了更好的支持。我还没有看到与Ruby类似的东西。

Python在我完成的数值计算/科学计算中似乎更快。除了用Python和Ruby编写类似的算法时,我没有其他证据可证明,Python算法的运行速度更快(YMMV)。


2
这实际上并没有对讨论做出太大贡献。Numpy的有效性已在接受的答案中详细介绍。您对性能的争论仍然令人信服;我不喜欢在讨论历史表现时依赖轶事,尤其是当任何此类论据可能已经被可信赖的(比无上下文的轶事更可信赖)基准很好地涵盖了。
布莱恩

@布莱恩,同意。
Josh Petitt

@Brian,我的特殊贡献是对N维数组的评论。是的,这是Numpy构建的基础,但是我没有提到ND阵列。这是线性代数的核心,也是Matlab和Numpy做得很好的。Ruby使用数组就像程序员使用数组一样,而不像工程师和科学家使用数组(即矩阵)那样。如果您认为有帮助,我将在接收到的答案中添加有关ND数组的注释。
Josh Petitt

@Brian,我仍然支持我的评论,即我还没有看到对Ruby进行科学计算的良好ND数组支持。
Josh Petitt

0

原因之一是Python对使用/集成/调用C / C ++代码提供了良好的支持,而据我所知,Ruby没有提供相同程度的(轻松)集成。这意味着您可以用C / C ++编写高性能的代码组件,然后使用Python(即高级/易于使用的语言)将整个内容粘合在一起。我想这也是Google早日采用机构的原因之一。


0

我认为Python在数据科学中如此流行的主要原因之一是因为我们可以节省大量时间/精力(例如金钱)来扩展脚本以实现真正的解决方案(例如软件系统)。使用Python,我们可以更轻松地基于为数据科学编写的代码构建系统解决方案。

大约15年前,我有使用此功能搜索口译语言的经验。当时,选择Python是其中之一,并不是因为它是数据科学的理想语言,而是因为它是一种罕见的OOP语言,具有快速/便携式解释器,并且还可以扩展为与其他语言(例如C / C ++ / Java。与当今不同,这些功能是从已为数据科学实现的基本代码直接构建解决方案的强大而罕有的功能。

时间可能是制作数据科学语言的另一个关键因素。15年前,我们发现已经有了一些基本的软件包,例如Python中用于数字计算的数值和scipy,但是我们甚至都不知道Ruby作为一种编程语言的存在。截至2018年底,我可以找到使用Ruby进行数据科学研究的多个项目。也许十年后,人们可能会问为什么Ruby在AI中如此受欢迎。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.