2015年10月24日土曜日

エコノミストにはC++ではなくC言語があっている

このエントリーをはてなブックマークに追加
Pocket

速度が出るからエコノミストには、C++があっていると言うITworldの記事が流れてきた。経済学でもカリブレーションと言って、数値演算で理論モデルの特性を明らかにする手法があり、それを使う人々は計算力の不足に悩まされている。速ければ速いに越した事は無いので、スクリプト言語と比較してC++が良いと言う話だ。そうですかと聞き流してしまいそうなのだが、記事の元になった分析が短絡的で、C++と言うよりC言語があっているように思える。

元ネタのAruoba and Fernández-Villaverde (2014)は、C++11、Fortran 2008、Java、Julia、Python、Matlab、Mathematica、Rで、ベルマン方程式を使ってある素朴な新古典派経済成長モデルを解いて*1、その時間を計測しており、その中で最も速いのがC++11だったので、C++がエコノミストにはあっていると言う話になっている。よく扱われるアルゴリズムでは単純な浮動小数点演算のループ勝負になっており*2、プログラミング言語としての便利さは考慮しなくて良い一方、往々にして数分では済まない計算が強いられるので、速度が重視されるようだ。ファイルやデータベースの入出力を行ったり、統計処理を組み合わせたりするのであれば、Pythonあたりが便利な気もするのだが、そういう点は重視されないらしい。

カリブレーションをする経済学者の需要はこういうものなのは分かるのだが、元ネタの議論が適切かは疑問が残る。ベンチマークとして見た場合、速度差が計算量に比例するかなどを評価すべきであろう。メモリー利用効率やガーベッジ・コレクターの挙動が影響してくる可能性がある。OpenMPやOpen MPIと言ったforループを手軽にマルチスレッド化、グリッド対応化してくれるツールは威力を発揮するので、それらの評価も加えておくべきであろう*3。また、ベンチマークに使っているソースコードが適切なものかは分からない。Rのコードが典型的だが、ベクトル演算ではなくスカラーで処理されており、Rの特性を考慮しない書き方になっている。推奨となっているC++も、C++と言いつつクラスは使っていないし、テンプレートもほとんど使っていない。ほとんどC互換のコードとなっている。C++/Boost/Matrixうぇいうぇいを期待しても、そんな事は無い。

C言語は、言語仕様が小さいので学習コストが低く、長く使われてきて挙動が安定的でかつノウハウが広く知られているので、エコノミストにも扱いやすい言語だと思う。非オブジェクト指向なので、GUIアプリケーションを書いたりすると混沌としてくるし、メモリの取得や解放を繰り返す必要があるとバグを誘発しやすい難点はあるが、肥大化して収拾がつかなくなる心配も無いであろう。なぜC言語ではなく、お化け仕様になってしまったC++を推奨しているのか、謎が尽きない。区分けがついていないのかと思ったのだが、元ネタで使ったソースコードの一覧を見ると、C++版の他にC言語版が置いてある。

*1経済学のための数学」にベルマン方程式の説明がある。

*2こういう動学モデルの解放自体はいろいろとあるので、もっと複雑なコードもあるように思えるが、"Comparing Solution Methods for Dynamic Equilibrium Economies"で取り上げられているものは、そう複雑ではない。

*3Rなどでも利用することはできるが、この基準で言うと開発元がサポートしているC、C++、FORTRAN、Javaにアドバンテージがある。なお、Fortran 2008で並列計算モデルが提供されており、本当はこちらの方があっているかも知れない。

0 コメント:

コメントを投稿