学びやすさ
PythonとFortranはどちらも比較的学習しやすい言語です。Pythonはより広く使用されており、Fortranは現在、数値計算用の「特殊」言語であると考えられているため、良いFortran学習教材よりも優れたPython学習教材を見つける方がおそらく簡単です。
PythonからFortranへの移行は簡単だと思います。Pythonはインタープリター言語なので、最初のプログラムを実行するために必要なステップ数print("Hello, world!")
は、Fortranの場合(「Hello world」プログラムの作成、コンパイル、実行)よりも少なくなります(インタープリターを開き、プロンプトで入力します)。また、FortranよりもPythonのオブジェクト指向スタイルを教えるのに適した資料があり、GitHubにはFortranコードよりも多くのPythonコードが用意されていると思います。
Windowsでの起動と実行
Pythonのインストールはそれほど苦痛ではありません。利用可能なWindowsディストリビューションがあります。AnacondaやEnthought Canopyなどの科学分布を使用することをお勧めします。コンパイラー自体はありません。通訳がその役割を担います。より多くの数値ライブラリが利用可能であり、C、C ++、およびFortranとうまく相互運用できるため、CPythonベースのインタープリターを使用する必要があります。他のインタープリターの実装には、JythonとPyPyが含まれます。
Windowsマシンでは、Fortranコンパイラをインストールするのは面倒です。典型的なコマンドラインコンパイラは、gfortran、ifort(Intelから、個人での使用は無料、それ以外は費用がかかります)、pgfortran(PGIからは無料試用版、それ以外は費用がかかります)などのプログラムです。これらのコンパイラーをインストールするには、CygwinやMinGWなど、何らかのUNIX / POSIXタイプの互換性レイヤーをインストールする必要がある場合があります。一緒に仕事をするのは苦痛でしたが、そのワークフローが好きな人もいます。Visual FortranなどのGUIを使用してコンパイラーをインストールすることもできます(再度、ライセンス料を支払う必要があります)。
Linuxでは、Pythonとコンパイラのインストールが簡単になります。AnacondaまたはEnthought CanopyをPythonディストリビューションとしてインストールします。
速度:生産性とパフォーマンスのトレードオフ
Python(またはMATLAB、Mathematica、Maple、または任意のインタープリター言語)を使用する場合、生産性のためにパフォーマンスを放棄します。Fortran(またはC ++、C、またはその他のコンパイルされた言語)と比較して、同じタスクを実行するためのコードの行数が少なくなります。これは、一般に、有効なソリューションを取得する時間が短くなることを意味します。
Pythonを使用する場合の効果的なパフォーマンスの低下はさまざまであり、計算量の多いタスクをコンパイル済みの言語に委任することで軽減されます。MATLABは同様のことを行います。MATLABで行列乗算を行うと、BLASが呼び出されます。パフォーマンスのペナルティは実質的にゼロであり、高いパフォーマンスを得るためにFortran、C、またはC ++を記述する必要はありません。Pythonにも同様の状況が存在します。ライブラリ(たとえば、NumPy、SciPy、petsc4py、FEniCSのdolfin、PyClaw)を使用できる場合は、すべてのコードをPythonで記述し、優れたパフォーマンス(多分10〜40%のペナルティ)を得ることができます。集中的な部分は、高速コンパイルされた言語ライブラリの呼び出しです。ただし、すべてを純粋なPythonで記述する場合、パフォーマンスの低下は100〜1000倍になります。したがって、Pythonを使用する場合、カスタムを含める必要がありますが、計算量の多いルーチンの場合は、C、C ++、Fortranなどのコンパイル済み言語でその部分を記述してから、Pythonインターフェイスでラップする方が良いでしょう。このプロセスを容易にするライブラリ(Cythonやf2pyなど)と、役立つチュートリアルがあります。一般的に面倒ではありません。
使用範囲
Pythonは、汎用言語として全体的に広く使用されています。Fortranは、数値計算と科学計算に大きく制限されており、主にそのドメインのユーザーに対してCおよびC ++と競合しています。
計算科学では、Pythonは通常、コンパイル済みの言語と直接競合しません。これは、私が述べたパフォーマンス上のペナルティのためです。数値集約的なアルゴリズムのプロトタイピング、データ処理、視覚化など、高い生産性とパフォーマンスが副次的な考慮事項である場合にPythonを使用します。Fortran(または別のコンパイル済み言語)を使用するのは、アルゴリズムとアプリケーションの設計が適切である場合、コードの作成とデバッグにより多くの時間を費やす意思があり、パフォーマンスが最も重要な場合です。(たとえば、パフォーマンスはシミュレーションプロセスの制限ステップであるか、研究で重要な成果物です。)一般的な戦略は、Pythonとコンパイル済み言語(通常はCまたはC ++ですが、Fortranも使用されています)を混合することです そして、コードの最もパフォーマンスに影響を与える部分にのみコンパイルされた言語を使用します。もちろん、開発コストは、単一の言語のプログラムよりも2つの言語のプログラムを作成してデバッグする方が難しいということです。
並列性に関しては、現在のMPI標準(MPI-3)にはネイティブのFortranおよびCバインディングがあります。MPI-2標準にはネイティブC ++バインディングがありましたが、MPI-3にはないため、Cバインディングを使用する必要があります。mpi4pyなどのサードパーティのMPIバインディングが存在します。mpi4pyを使用しました。うまく機能し、簡単に使用できます。大規模な並列処理(数万のコア)の場合、Pythonモジュールを動的にロードするなどの方法で素朴な方法で大規模な処理を行うため、コンパイルされた言語を使用することをお勧めします。PyClaw開発者が示したように、そのボトルネックを回避する方法はありますが、回避する方が簡単です。
個人的な意見
私はFortran 90/95で約10年の経験があり、Fortran 2003でもプログラミングしました。Pythonで約5年のプログラミング経験があります。率直に言って、Pythonでより多くのことができるので、Fortranを使用するよりもPythonを使用しています。私が行う必要がある作業の大部分は、主要なスーパーコンピューティングリソースを必要とせず、一般に別の言語で再開発する価値がないため、PythonはODEとPDEを解決するのに十分です。コンパイルされた言語を使用する必要がある場合は、C、C ++、またはFortranをこの順序で使用します。
私が見たFortranコードのほとんどは見苦しいものです。これは主に、計算科学コミュニティのほとんどが過去30年間にソフトウェアエンジニアによって発見されたベストプラクティスを知らないか、嫌いだからです。つまり、Fortranには優れた単体テストフレームワークがありません。(私が出会った中で最高のものは、NASAによるFUnitであり、それはもはやメンテナンスされていません。)いくつかの優れたPythonユニットテストフレームワーク、優れたPythonドキュメントジェネレーター、そして一般的に優れたプログラミングプラクティスのより良い例があります。