注意:以下文章可能包含有争议的观点,因此请注意,这些只是我的观点,并不旨在冒犯任何人。
从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 ++)并转而使用一种比较晦涩的语言,那么我最有兴趣了解您的经历。