我的2美分。
我认为对此进行一般性的编写要容易得多,而不仅仅是C / C ++。首先,不一定要使用Python之类的语言库来获得速度上的好处,即使这样做是后果。我认为
@David很好地说明了原因。
从顶部开始,语言的实现在某种程度上决定了您可以访问的库。计算科学中常用的语言包括C,C ++,Python,Perl,Java,Fortran和R。较少见的示例可能是Ocaml和Common Lisp。现在,由于这些语言大多数都是用C编写的,因此它们具有C的自然外部函数接口。但是,要调用Python的Perl库并不容易,反之亦然。所以在实践中人们倾向于
使用以其实现语言编写的库,通常是标准库的一部分,或者以其他方式广泛使用,或者
通过语言FFI调用C / C ++库。这假定包装器尚不存在,因为如果存在,则很难与(1)区分开。
(2)通常比较困难,因为您必须自己包装C / C ++函数。另外,您必须捆绑库,或添加额外的依赖项。因此,人们更倾向于使用内置语言库,而不是使用C语言中的GSL。
对于非常通用的例程,比如说从分布中生成随机样本,或者是诸如积分求积之类的基本数值例程,重用某些库很容易且普遍。随着人们试图实现的功能变得越来越复杂,人们越来越不可能在另一个库中找到一个人想要的确切函数,甚至一个人也可能花大量时间搜索并最终适应该函数,这成倍地不可能。必要的(例如,代码样式/设计可能是个问题)。并且如上所述,人们只能访问那里的一部分库。另一方面,如果算法本身很复杂而不是主要关注点,那么实现自己的算法可能会令人望而生畏,当然,人们必须解决那些讨厌的速度问题。
因此,这成为成本/收益分析中的优化问题。我的经验是,即使对于像MCMC这样的相对标准的技术,我通常也会写自己的代码,因为它更适合我设计整体软件的方式。
当然,即使您最终不使用该代码,也可以向其他人的代码学习。不过,我不知道科学家实际上有多频繁地这样做。我的印象是,阅读他人的代码以学习的更多是软件工程师的工作。