私の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のような比較的標準的な手法であっても、ソフトウェア全体の設計方法により適しているため、通常は独自のコードを書くことになります。
もちろん、コードを使用しなくても、他の人のコードから学ぶことは可能です。しかし、科学者が実際にこれを行う頻度を知りません。私の印象では、他の人のコードを読んで学ぶことは、ソフトウェアエンジニアのことです。