PyCon 2011演讲中有一句话引述:


至少在我们的商店(阿贡国家实验室),我们有三种
可接受的科学计算语言。按此顺序,它们是C / C ++,所有方言的Fortran和Python。您会发现
绝对,完全缺少Ruby,Perl和Java。


这是在更通用的高性能计算环境中。授予的报价仅来自一家商店,但另一个有关HPC语言的问题也将Python列为要学习的语言(而非Ruby)。在那个问题空间(并且不使用Perl / Java)。但令我感到惊讶的是,鉴于HPC在Python和Ruby中的使用非常相似,因此它们之间会有很大的不同。 (请注意-我是Python的粉丝,但对Ruby却一无所知)。关于可用的库吗?一些特定的语言功能?社区?还是只是历史上的偶然性,它本来可以反过来?

评论

我建议尽管它们都是动态语言,但Python和Ruby却大不相同。比相似的更多。

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

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

“可读性很重要”

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

#1 楼

我将继续发表评论。
我认为有一些因素影响了Python在科学计算中的使用,尽管我认为没有明确的历史观点可以说:“是的,这就是为什么Python被用于Ruby或其他方面的原因。“
早期历史
Python和Ruby的年龄大致相同-根据Wikipedia的说法,Python于1991年正式发布,而Ruby于1995年正式发布。
但是,Python的出现要比Ruby早,因为Google已经使用Python并在千年之交寻找Python开发人员。既然我们在编程语言的使用及其对使用它们的影响方面没有悠久的历史,我将得出理论,谷歌对Python的早期采用对那些希望超越使用Matlab,C ++, Fortran,Stata,Mathematica等。
即,我的意思是说Google在一个拥有数千台机器(认为并行化和可扩展)并不断处理数百万个数据点(再次可扩展)的系统中使用Python。
Event Confluence
科学计算曾经在SGI和Crays之类的专用机器上进行(还记得吗?),由于其相对简单并且可以
在过去的十年左右的时间里,商品硬件(意味着您或我可以在没有百万富翁的情况下负担得起的东西)已经占领了科学和海量计算领域。看一下当前的前500名排名-世界上排名最高的“超级计算机”都是使用常规的Intel / AMD硬件构建的。 Google使用的是商用硬件,并且有数千台机器。
如果您深入研究一些旧的科学计算文章,它们会在2000年代开始兴起。
早期支持
这是2000年为《天文数据分析软件和系统》撰写的文章,建议将Python用作科学计算的语言。面向对象的程序设计语言在科学应用中开始受到相当大的关注(Python,1999)。这是因为Python和一般的脚本语言代表了许多科学项目的下一个逻辑步骤(Dubois 1994)。首先,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?) br />

BioPython-用于python的生物计算库,至少可以追溯到2001年


SAGE-于2005年初首次公开发行的数学软件包


还有更多,尽管我不了解他们的很多时间表(除了浏览他们的下载网站),但是Python也有SciPy(基于NumPy构建,于2006年发布) ,在2000年代初期与R(统计语言)绑定,获得了MatPlotLib,并在ipython中获得了一个非常强大的shell环境。
ipython于2000年代初首次发布, nd添加了许多功能,使其非常适合科学计算,例如集成的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的使用。其中的原因可能是由于其历史悠久,以及直到2000年代Ruby仍然相对默默无闻,而Python则由于Google的传福音而受到关注。
因此,如果您在1995年至2000年期间评估脚本语言,那你真的在看吗有Perl,其语法在语法上可能已经足够不同,以至于人们不想使用它,然后有Python,它具有更清晰的语法和更好的可读性。
是的,可能有很多自我增强-Python已经拥有了所有这些伟大而有用的用于科学计算的库,而Ruby却很少有人提倡将其用于科学计算,并且诸如SciRuby之类的一些库正在萌芽,但是Python的工具在过去的十年中已经成熟。 /> Ruby的整个社区似乎对将Ruby成为Web语言更加感兴趣,因为这确实使它广为人知,而Python则是从另一条道路开始,后来被广泛用作Web语言。

评论


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

– Spencer Rathbun
2012年3月7日在20:33

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

– wkl
2012年3月7日20:44



1991年,我们使用TCL将数字库连接在一起,以此作为分析数据的方式,而不必编写大量的C / Fortran。 Python恰逢其时,以取代TCL。与PERL相比,与“ C”(以及通过F2C与fortran进行接口)的便捷性非常重要,TCL与“ C”的接口非常容易

–马丁·贝克特(Martin Beckett)
2012年11月15日18:51



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

– radarbob
16年7月20日在14:34

#2 楼

我已经广泛地将Python用于工程应用程序以及将Ruby用于Web应用程序。 br /> Python的设计前提是“应该有一种-最好只有一种-显而易见的方式”。这使得阅读某人的代码并确定其意图变得更加容易。这是进行工程等方面同行评审的关键。 。这在科学或工程师环境中会引起太多歧义。

评论


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

– Dominic Cronin
2012年12月7日在22:45

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

–安德鲁·维特(Andrew Vit)
2012年12月8日在8:28

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

–乔纳森·兰德鲁姆
13-10-15在21:29

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

–mc0e
13-10-18在13:45

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

–凯文
18/12/10在5:03

#3 楼

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

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

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

评论


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

–sepp2k
2012年3月7日14:08

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

–独眼巨人
2012年3月7日15:54

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

–sepp2k
2012年3月7日15:57

我支持sepp2k,我也不赞成这种说法。某些语言(例如Java)确实对您施加了OO范例-Ruby则不是。是什么阻止您使用Ruby编写纯粹的过程或功能程序?

–迈克·巴兰恰克(Mike Baranczak)
2012年3月7日15:59

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

– Spencer Rathbun
2012年3月7日16:02

#4 楼

BDFL(Guido van Rossum)首次编写Python时,其目标是与普通英语(DARPA资助提案)一样易懂,从而消除了常见的编码错误。使用缩进来分隔块。在具有明确的复杂语句定界符的语言中(例如C括号,Pascal BEGIN / END),在将代码提供给词法分析器之前,空白将折叠为单个空格字符。

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

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

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

评论


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

–杜德利先生
2014年5月9日15:49



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

–兰斯·赫尔斯滕
2014年5月9日16:09

#5 楼

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



与python(DSL等)相比,ruby的编码更直观:给出正确的软件包: >
检查bioruby:http://bioruby.org/序列保留可以很简单:s.reverse等。
如果使用数据库:ruby数据库绑定API可以说比python更好。 >
红宝石可以在简洁的同时实现更高级别的抽象。红宝石的采用曾经/现在/将由于其复杂性而受到阻碍。我认为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数据分析/科学计算的阶段。

#6 楼

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

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

评论


“最后,python就像每个人的语言一样”,您需要提供一个源来备份。

–沃尔特
2012年12月7日在20:55

#7 楼

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

Person.find_by_name 'Juanito'


,但是您更关心

A = B*C + D


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

#8 楼

Python通过Numpy软件包更好地支持N维数组。我还没有看到与Ruby类似的东西。

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

评论


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

–布赖恩
13-10-15在21:23

@布莱恩,同意。

–乔什·佩蒂特(Josh Petitt)
13-10-16在2:52

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

–乔什·佩蒂特(Josh Petitt)
13-10-16在2:55



@Brian,我仍然支持我的评论,即我还没有看到对Ruby用于科学计算的良好N-D阵列支持。

–乔什·佩蒂特(Josh Petitt)
13-10-16在2:57

#9 楼

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

#10 楼

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

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

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