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

计算科学 语言
2021-11-26 21:15:45

注意:以下帖子可能包含有争议的观点,因此请注意,这只是我的观点,无意冒犯任何人。

自 1999 年左右以来,我一直在以某种形式进行编程。我最初使用 R,然后在 2004 年左右,主要切换到 Python。

对于许多科学应用,例如模拟,包括诸如 MCMC 之类的东西,R 和 Python 都太慢了,需要加快速度。这样做的通常方法是使用 C 或 C++ 进行扩展。对于 R 和 Python,这就是我所做的,使用带有 C++ 的 R 的 C API,以及带有 Python 的 Boost 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 科学计算的内容之一。我写信给塔马斯,他立即给予帮助和鼓励。引用他的话

使用 Lisp,我的编程效率可能提高了 10 倍,但这花了大约一年的时间,而我仍在学习(尽管 2 个月后我做得很好)。因此,如果您正在处理时间紧迫的事情,请推迟切换。

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

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

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

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

人们用 CL 引用的最常见问题是缺少库。这是通用计算中的一个严重问题,但在科学计算中可能并非如此,尤其是从算法的底层实现。具体来说,我大部分时间都可以使用基本数学库,包括概率分布函数、多维数组库和一组基本容器,例如 C++ 和 Python 标准库中的 map、set、list 等。

我对 Ocaml 的了解甚至比对 CL 的了解还要少,但我将其作为替代方案。它被认为非常快,由法国研究人员免费实现,并且似乎是用于科学计算的 ML 系列语言中最可行的。

最后,我想知道其他人是否有这方面的经验,以及他们有什么想法(如果有的话)。

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

3个回答

我们开发Julia正是出于上述原因。没有一种好的高级科学计算语言也能提供足够好的性能,以至于您不必继续用 C/Fortran 重写部分代码。julia 的设计具有相当多的 lisp 影响,因此您可能会喜欢它,而您的合作者如果不关心功能部分,则可以将其视为 matlab 或 R。缺点是语言是新的,还没有日常使用所需的所有库。

马克,很想将朱莉娅添加到您的基准中,看看我们的表现如何。请跳到我们的邮件列表,让我们知道您想在 julia 中看到什么,以便它对您更有用。

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

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

另外,对 Julia +1。我想当它变得更稳定并得到广泛支持时我可能会切换到它,即当标准模块被包装用于我喜欢做的工作时。

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

对于科学中的 Lisp,请参见示例

我相信还有更多的参考资料。但是,我不能引用任何使用 OCaml 或 Lisp 完成计算工作的主要研究项目。选择其中任何一个都意味着相对孤立地工作。

您可能还对Julia感兴趣,这是一种目前正在开发的用于科学计算的新语言,具有明显的 Lisp 影响。