使用非常规编程语言进行科学计算


22

注意:以下文章可能包含有争议的观点,因此请注意,这些只是我的观点,并不旨在冒犯任何人。

从1999年左右开始,我就开始以某种形式进行编程。我最初使用R,后来在2004年左右使用,主要是改用Python。

例如,对于许多科学应用程序而言,仿真(包括MCMC等),R和Python都太慢,需要加快速度。这样做的通常方法是使用C或C ++进行扩展。对于R和Python,这就是我所做的,使用R的C API和C ++,以及Boost Python库和Python。

但是,由于各种原因,这种组合不是理想的解决方案。在编程中,特别是算法中,什么重要?表现力和速度当然是相关的。一门语言表现力越强,使用它就能写得越快。

1)就表达能力而言,我认为R和Python都不是编写科学算法的理想选择。它们没有紧密映射到基础算法。但是,它们都比C ++好得多。

2)我喜欢用Python编写,这是一种令人愉悦的语言,尽管如上所述,它并不是算法工作的理想选择。但是,当由于速度问题而不得不使用Python / C ++组合时,这种混合使用起来会变得不太愉快。通常会发生的事情是,我首先使用Python编写代码,一旦有了运行良好的东西,就常常发现它太慢了(因为某些主观值太慢了)。然后,我面临的决定是花一些不合理的时间用C ++重写它,还是忍受缓慢。事后看来,我常常会觉得自己最好还是忍受缓慢,特别是因为获得的加速是无法预测的。而且,两者之间的Boost Python接口是一个非常麻烦的维护工作,并用两种截然不同的语言将代码粘合在一起,这很让人分心。无需批评Boost Python,它就像一个人所能想到的一样强大的界面,并且几乎在大多数时候都可以使用。

现在,在一个拥有无限时间和资源的理想世界中,这些问题都不是什么大问题。但是,在我从事的科学项目中,我有以下经验。

无论我是否在该项目上有合作者,我似乎总是想尽一切办法进行计算。在总共5个重大项目中,我只有一个人的大量参与才能参与一个项目。一个人所做的不只是减轻体重;他做了我或更多的事情。但是,在所有其他情况下,包括具有多个合作者的项目,我已经(实际上)完成了所有计算工作。虽然我可以说我并没有受到最好的合作者的祝福(这似乎是懒惰和无能的结合),但我不清楚这种情况在将来是否有可能改变。

计算科学工作是一项巨大的工作,如果我不能改变合作者的行为方式,那么我可以改变工作方式。最重要的改进是更快地完成工作。这使我想到这里的主要考虑因素,那就是将语言切换到非正统的东西可能会有所帮助。根据过去的研究,按可能性顺序排列的最可能的候选对象是Common Lisp和Ocaml。我已经考虑了多年,但是最近一直在认真考虑。

据我所知,很少有人使用CL或Ocaml进行科学计算。在搜索此站点时,我发现有两个引用CL(一个是我的),另一个引用了Ocaml(我的)。多年来,我与那些在边缘工作的冒险人士保持了令人鼓舞的联系。2008年,我遇到了Tamas K. Papp对彼得·塞贝尔(Peter Seibel)的“ Practical Common Lisp”(我拥有)进行的书评。这引起了我的注意,因为这是我在网上遇到的为Lisp进行的科学计算中为数不多的提及之一。我写信给塔马斯(Tamas),他立即给予了帮助和鼓舞。引用他

使用Lisp,我的编程效率可能提高了十倍,但这花了大约一年的时间,而且我还在学习(尽管两个月后我的表现还不错)。因此,如果您的工作时间紧迫,请推迟切换。

您应该考虑问问有关cll的问题,我不是唯一知道这些事情的人,其他人也在Lisp上进行科学计算。

他还拥有一个博客一个GitHub页面

我曾与之短暂通信的另一个人(2006年12月)是Ira Kalet,他在放射肿瘤学领域使用了Common Lisp。

也许还有其他人在Lisp上进行科学计算,但我不认识任何人。

人们用CL引用的最常见问题是缺少库。这在通用计算中是一个严重的问题,但在科学计算中可能不是那么严重,特别是从根本上实现算法时。具体来说,我大部分时间都可以使用基本的数学库,包括概率分布函数,多维数组库以及C ++和Python标准库中的基本容器集,例如地图,集合,列表等。

我对Ocaml的了解甚至少于对CL的了解,但可以选择替代。它据说非常快,由法国研究人员免费实施,并且似乎是ML系列科学计算中最可行的。

最后,我想知道其他人是否对此有经验,他们有什么想法(如果有)。

编辑:在我上面讨论的问题的背景下,我对第一手经验最感兴趣。例如,如果您曾经使用Python和C ++(或R和C ++)并转而使用一种比较晦涩的语言,那么我最有兴趣了解您的经历。


2
堆栈交换用于提问,而不是发布生活故事!您的问题似乎是“是否有使用Common Lisp或OCaml的科学计算项目”,对吗?
khinsen 2012年

4
同意,这读起来更像是一篇博客文章,但是我很喜欢前提。您是否可以尝试将其减少到2-3段?
阿隆·艾玛迪亚

1
也同意。支持主要问题时,评论和个人经验是不错的;过多的细节会淹没要点。如果您可以简化您的问题,我认为它会更容易阅读,并且会得到更有针对性的高质量答复。
Geoff Oxberry 2012年

1
@FaheemMitha:在“理想世界”中,您提到的过程都是手工优化的组装……听起来对我来说真是令人沮丧!
meawoppl 2012年

3
@FaheemMitha:我认为您可以做的最好的事情就是改善您的问题。好像您是在讲一个有关您的经历的故事(没关系),然后最后,您将该问题作为陈述的结尾掩埋了。(“总而言之,我想知道...”)您可以做的最好的事情就是使该部分成为一个问题,以便人们在浏览您的问题时可以很容易地识别出您要问的问题。我不得不回去几次才能弄清楚。
Geoff Oxberry 2012年

Answers:


18

我们开发了朱莉娅确切提出的理由。只是没有一种优秀的高级科学计算语言也能提供足够好的性能,因此您不必继续用C / Fortran重写部分代码。julia的设计具有相当大的影响力,因此您可能会喜欢它,而如果您的合作者不关心功能部件,则可以将其视为matlab或R。缺点是该语言是新语言,还没有拥有日常使用所需的所有库。

马克,很想在您的基准测试中加入茱莉亚,以了解我们的票价。请跳至我们的邮件列表,让我们知道您想在julia中看到什么,以便它对您更有用。


看起来真漂亮!我一定会检查一下自己的工作。目前,我在理论上所有的工作中都使用python,只是因为使用快速C ++代码获得的时间与最初用C ++编写的时间所抵消:)
Lagerbaer 2012年

9

编程语言的速度,大小和可靠性确实很好地完成了您在“问题”中表达的许多不同问题。它比较了33种语言中相同基准的一堆实现的速度和代码库大小!

我之所以成为Python爱好者,主要是因为多余的计算时间比多余的编程时间更为常见。我更愿意浪费CPU周期,而不是牺牲可以花在一些更有趣事情上的时间。

另外,对朱莉娅+1。我想当它变得更加稳定并得到广泛支持时,即当标准模块包装好我喜欢的工作时,我可能会改用它。


4

有关OCaml的科学应用,请参见例如

有关Lisp的科学知识,请参见

我相信还有更多参考资料。但是,我无法引用在OCaml或Lisp中完成计算工作的任何重大研究项目。选择任何一种都意味着相对隔离地工作。

您可能还对Julia(一种正在开发中的具有Lisp明显影响力的科学计算新语言)感兴趣。


1
我也许应该更清楚地表明我对第一手经验最感兴趣。我将编辑问题以反映这一点。
Faheem Mitha 2012年
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.