質問: 私は岩波データサイエンスVol.2「統計的自然言語処理」を読んでいますが、そこには、自然言語処理では個別の問題のためのプログラムを組み合わせて処理を行うことになるが、多くの場合、最終的には自分でプログラムを書く必要があると説明した後で、次の記述があります。 > > 簡単な処理ならばPythonのようなスクリプト言語でよいが, 複雑なモデルではベイズ推論も含め, 最先端の研究はほとんどC++, Java, Scalaといった言語で一から実装されている。(p.92) > > > これはなぜですか? PythonとC++等では、何か圧倒的な差があるのですか?それともちょっと違うだけでPythonでもできますか?
回答: 「○○をするのに最も適した言語は?」という形の質問では、回答者の主観的な考えが大いに入ってきうると考えられます。そのためこの回答では、自然言語処理をする上で Python, C++, Java, Scala の言語間で起こりそうな違いについて解説します。 まず大前提として、原理的に **「このプログラミング言語でないと実装できないアルゴリズム」は存在しません。** どの言語で書くにしても、充分がんばれば書けるはずです(どれもチューリング完全だからです)。ただし、どれかの言語でないと既存のライブラリが少なくて実装が大変、という問題はあるでしょう。これは今解決したい個別の具体的な問題に依存します。 どの言語でも実装できるとして、次に気になるのはパフォーマンスです。実行速度や必要メモリ量は、プログラミング言語やその言語の処理系によって変わりえます。 ここで問題となってくるのが、Python のプログラムは一般にインタプリタを通して実行されるということです。 つまり、C++, Java, Scala で実装されたプログラムは通常の場合コンパイラによって一度機械語に直された後実行されるのに対し、Python で実装されたプログラムは毎回プログラム自体が処理系によって解釈され実行されます。一般的に前者の方が様々な最適化を行いやすく、実効速度が上がります。このため、特に大きなプログラムを何回も動かす場合、 **前者の方がパフォーマンスが良い** と言われています。逆に、1回しか動かさない、かつ小さなプログラムの場合、前者と後者でそこまで大きな差は無いかもしれません。 ただし、Python には更に個別の事情があります。Python は確かにインタプリタで動いていますが、その実、背後で動いているライブラリは Fortran, C, C++ といった言語で実装され、コンパイルされた後のものであったりします。つまり、API の呼び出しやデータの前処理といったインターフェース部分の処理は遅くなりえますが、その後の計算部分はそこまで差がないかもしれないということです。このあたりはそれぞれの具体例で実際にベンチマークを取らないと詳しいことまでは言えないと思います。 ※ この回答では、プログラム自体の書きやすさによって生まれる開発効率の違いや、PyPy のような JIT コンパイラの入った処理系については触れていません。また、特殊なアーキテクチャを用いている場合、処理系がそのアーキテクチャに対応しているかという問題もあります。並列処理を行いたい場合、用いたい並列処理ライブラリがその言語に対応しているかという話もありそうです。コンパイラとインタプリタの比較においても、Java や Scala のコンパイル先は JVM 用の中間言語なので、細かく議論するならば C++ と Java / Scala にも差異がありえます。