PythonとFORTRAN


17

どちらが良いですか:FORTRANまたはPython?そして、どちらの場合もGnuplotが必要だと思います。

現在、Windowsマシンで作業しています。

モンテカルロシミュレーション、数値積分と微分、分子動力学などを含む物理問題の数値解を得るために使用したいと思います。

FORTRAN(私が信じる77)とPythonの両方を紹介する計算物理学のコースを見ました。私は一方から始めて、もう一方を学ぶことを計画していますが、どの遷移が最も簡単かはわかりません。

また、どのコンパイラをお勧めしますか?

私にとっての基本的な質問は、学習するのが最も簡単なもの、最も速いもの、最も使いやすいもの、そして何よりも最も使用されているものです(これら4つの比較)。そして、その次に使用されている最も一般的な(無料または有料)コンパイラは何ですか?現在、古いラップトップ(初期のIntelデュアルコア)をLinuxに変換することを検討しています。うまくいけば、それは十分に高速です。

これまでの回答に感謝します!私が探しているものと一致する答えはLKlevinとSAADのものです。

私はC ++、Mapleの基本を知っており、MATLABとMathematica9をマスターすれば、それが助けになります。


12
もっと具体的にする必要があります。これは、「ハンマーとドライバーのどちらが良いですか?」と尋ねるようなものです。見てくださいscicomp.stackexchange.com/questions/11006を(それはC ++の代わりに、Fortranのについてですが、ほとんどの点が等しく適用されるべきです)。
クリスチャンクラソン14年

@ChristianClason、フェアポイント:p
ニック

編集していただきありがとうございます。ただし、これによって実際の絞り込みは行われません。上記のリンクされた質問への回答として既に与えられている以上に何が言えるかはわかりません。
クリスチャンクラソン14年

2
また、コンパイラに関する質問は別の問題であり、別の質問である必要があります。(それ以外の場合、Fortranに精通しているがPythonに興味のない人には表示されません。)いくつかの推奨事項はscicomp.stackexchange.com/questions/8617で既に提供されています
クリスチャンクラソン14年

1
matlabを知っていれば、ほとんどの数値アルゴリズムを実装して学習できますが、パフォーマンスはほとんどの場合、組み込みのmatlabルーチンよりも劣ります。そこから、パフォーマンスのニーズを決定し、より効率的なライブラリ/言語に移行できます。
ゴドリックシーア

回答:


29

学びやすさ

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ドキュメントジェネレーター、そして一般的に優れたプログラミングプラクティスのより良い例があります。


非常に素晴らしく、完全な答え:)。昨日、Pythonコンパイラが既に存在するLinuxをインストールしました。LinuxとWindowsマシン間でファイルを共有する簡単な方法があるのではないかと思いました。スティックを使用してデータを転送するたびに、WindowsとLinuxの両方のマシンが特定の部分(NFTS形式でフォーマットされている)を無視することに気付きました。
ニック

そして、私の最後の問題は、FAT32形式を使用してbijで解決されます(少なくともこれまで)。
ニック

注意:FAT32の最大ファイルサイズには制限があります。
meawoppl

@ Meawoppl、LinuxとWindowsの間でファイルを交換するより便利な方法はありますか?多分ドロップボックス?ハードウェアベースのソリューションもありますか?
ニック14

ファイルを4GB未満に保管してください:P本当に、良い解決策はわかりません。また、ファイル名の規則にも多少の皮肉があります。M $を非常に悲しい顔にする<3.txtというファイル名を付けることで、一部のウィンドウサポートを中断したことを思い出します。LinuxでのNTFSサポートは現在非常に優れていますが、特にOSXでは完全に禁止されています。今ではこの問題を解決できると本当に思っていました。
meawoppl 14

7

私はFortanから離れるか、必要な場合には、合理的に新しいバージョン(77ではなく2003)を使用します。多くの物理ソフトウェア(特にモンテカルロシミュレーション)はFortranで書かれています。これは、プロジェクトが当初80年代に開始されたからです。

そうは言っても、PythonとFortranは2つの非常に異なる言語であり、使用する対象はまったく異なります。Pythonは高レベルであり、一般にそれほど高速ではありません(FortranおよびC ++と比較して)。あまりにも多く使用されている理由は、ほとんどの場合に十分に高速であり、やりたいことの多く(すべてではない)に優れた(Fortran駆動の)ライブラリがあるためです。また、プロット用の優れたMatplotlibがあり(GNUplotは不要)、Cythonのようなものを使用して高価なビットを書き込むことで、かなりのパフォーマンスを得ることができます。ただし、FortranやC ++ほど高速ではなく、並列化はひどいため、高性能の数値計算には不十分です。ただし、FortranまたはCライブラリを呼び出すことで必要なものを処理できる場合は、

Fortranはやや低レベルの言語です。数値の場合、ライブラリのサポートは驚くほど優れていますが、それでも非常に低レベルであるため、誤って間違った配列サイズをメソッドに渡すなど、避けなければならないバグがたくさんあります。これらのバグは見つけるのが難しく、気づかないかもしれません。信じてください。Fortran77を書くのにかなりの時間を費やしました。

C ++は(私の謙虚な意見では)幸せな媒体です。ArmadilloやEigenのようなライブラリを使用すると、低レベルのスタイルのパフォーマンスを実現しながら、かなり高レベルのスタイルのコーディングを回避できます。

パフォーマンスといえば、現在の数値Pythonの唯一の本当の選択はCPythonです。WinPythonのようなものをダウンロードすると、必要なライブラリの大部分も入手できます。

Windows上のFortranの場合、事態は少し難しくなります。Linuxに切り替えて、gfortranまたはIntels ifortコンパイラを使用することをお勧めします。私の経験では、Ifortは数値コードの方が高速になる傾向がありますが、非商用、非学術的使用の場合のみ無料です。

要約すると、非常に重いシミュレーションを実行したい場合を除き、Pythonの方がはるかに簡単な選択であり、作業がずっと楽しくなります。また、ほとんどの学生レベルのプロジェクトに十分な速度でなければなりません。より良いパフォーマンスが必要な場合は、すでに書き込まれているライブラリの無駄な量を調べて、言語を決定します。ゼロから作成する必要がある場合は、C ++を使用します。

また、警告:物理学者はプログラミングが簡単で、数学で使用するのと同じ厳密さを必要としない傾向があるため、物理学者によって書かれたほとんどのコードは非常にひどいです。クラスを受講するか、プログラミングを教える本を購入することを検討してください。

免責事項:私はFortran 77ベースのモンテカルロコードでかなりの時間を費やし、現在Pythonですべてのデータ処理を行っている物理学者です。


並列化に関して、研究者たちは、優れた並列効率で数万のコアでPythonを並列に使用することに成功しています。(たとえば、PyClawは65,000以上のコアであるすべてのShaheenで実行されています。)
ジェフオックスベリー

1
まあそれは可能ですが、並列部分がCPythonの外部で発生することを確認するだけで、かなりの努力が必要です。PyClawの並列部分(PETSc)は、たとえばCで書かれています。別の方法として、CPythonの複数のインスタンスを実行することもできますが、決して簡単ではありません。
LKlevin 14年

ほとんどの並列アプリケーションは重要です。「[Python]並列化は非常にひどく、高性能の数値計算には不十分です」と書いています。純粋なPythonで高性能コードを作成する人はいません。この決定の理由は、並列処理とは関係がなく、適切に使用されている限り、高性能コンピューティングのインターフェイス言語としてのPythonの使用を無効にすることはありません。あなたの引用は、並列性、高性能、および解釈された言語の問題をまとめるストローマンです。誰もそのようなアプリケーションを設計しません。
ジェフオックスベリー14年

Pythonはほとんどすべての目的で優れたインターフェース言語であることに同意しますが、それは問題から遠ざかっています。ほとんどのアプリケーションは自明ではありません。ここでの問題は、自明なものも含め、並列化のすべてのケースがPythonで自明ではないことです。NumpyまたはCythonの操作に関して問題が十分に説明されていない場合、これは迷惑になる可能性があります。いいえ、65000コアクラスターではこれを使用しませんが、100コアで2倍のパフォーマンスヒットを受け入れる場合があります。
LKlevin

並列処理に関して、Fortranの良い点は、MPI / OpenMPの他に、標準の一部であるCo-arrayもあることです。たとえば、このjolts.stanford.edu/72/…を
stali

7

Pythonは非常に低速で高レベルの言語です。高速な数値計算を行うには、C / C ++などの低レベル言語でメインの計算カーネルを作成する必要があります。つまり、1つではなく少なくとも2つの言語を学習する必要があります。また、デバッグ/インストール/メンテナンスなどに関連する追加の頭痛にも対処する必要があります。ほとんどの人は、Pythonを構文糖として使用して、C / C ++の欠点を隠します。

最新のFortran(90以降)は、MATLABのような構文を備えた高速かつ高レベルです。そのため、次のようなことができます。

k=k+matmul(transpose(B),matmul(D,B))*weight(i)*detj

または

indx(:)=indxmap(indx(:),2)

またはさらに簡単

indx=indxmap(indx,2)

Linuxには、多数の無料のFortranコンパイラがあります。私が使う

  1. GCC
  2. Solaris Studio
  3. Open64
  4. Intel(非​​商用利用のみ)

Mac / OSXは使用しませんが、無料のPGIがあります。

また、FORTRAN 77を使用しないでください。誰も新しいコードを書くためにそれを使用しません。

免責事項:私は個人的にPythonを見て、独自の小さな非構造化FEコード(PETScの最上位)を記述しましたが、作業/コーディングの量は単なるFortran 95の記述以上のものでした。


1
これに、Fortran 2003で非常に本格的なオブジェクト指向プログラミングを行えることを付け加えます。たとえば、このガイドを参照してください。私は自分のコードでそれを多く使用してきましたが、それは私がやりたいことに対して非常に効果的でした。多くの人がそれを避けるようにあなたに言うでしょう-私は心を開いておくと言います、あなたはそれをたくさん好きかもしれません。確かにそうです。
ダニエルシェイプロ14年

4

Python は、グリッド生成、配列計算、データ構造処理(numpyおよびpandas)、およびmatplotlibによるデータ視覚化など、十分に文書化された汎用パッケージを使用した完全なシミュレーション解析に非常に実用的です。大きな結果ファイルを使用した複雑なシミュレーションの場合、VTKパッケージを使用すると、高度なオープンソースアプリケーション(ParaviewやVisitなど)でデータをエクスポートできます。

Fortranは、しばらくの間、シミュレーションのさまざまなドメインの優先言語でした。読みやすい(ただし、Pythonコードよりも読みにくい)。配列処理は、言語の長所の1つであり、あらゆる種類の配列演算の定義と使用が非常に簡単です。デバッグ時にも便利です。

比較するとパフォーマンスが低下します。コンパイルされた言語(C ++およびFortran 90)を使用して大規模な計算を行っただけで、Pythonを使用したことはありません。別のスレッドは、インタープリターおよびコンパイルされた言語に関するより多くのパフォーマンス情報を提供し ます。コンピュータープログラミングの学部課程を教えるとき、どの言語を使用する必要がありますか?

個人的には、特に後処理のために、一般的にPythonで作業するのが好きです。Pythonプログラミングは楽しい!


1
パフォーマンスはほとんど常に重要です。電子メールをチェックしてWebを閲覧するために、16GbのRAMを備えた8つのコアが必要なのは、パフォーマンスへの注意の欠如です。
スタリ14年

私は他人のpythonコードを読まなければならないという不幸を経験しました。pyコードを読みやすいと分類しません。
ビスワジットバネルジー

@stali:私は完全に同意します
SAAD

1
@BiswajitBanerjee:どんな言語でも複雑なコードを書くことは不可能ではありませんが、少なくとも関数の入力と出力を簡単に識別できます。Fortranが恐ろしいのはここです!:)
SAAD

3

Pythonでは、Gnuplotは必要ありません。たとえば、matplotlibを使用したり、IPythonシェルを使用したりできます。IPythonは、%pylabモードで、MATLABで使用できるプロットコマンドとほぼ同じプロットコマンドを提供する対話型Pythonシェルです。

科学計算は、今後5年以上でMATLABからPythonへの移行を大幅に拡大するでしょう。


Gnuplotの利点の1つは、Linuxマシン(クラスター/サーバーなど)にほとんど常にインストールされ、クイック/ダーティvizに非常に役立つことです。vizのviのようなものです。
スタリ14年

1

私はMATLABを使い続けます、それは高速な数学ライブラリを呼び出します、そしてあなたはWindowsでFORTRANに切り替えることによってパフォーマンスの大きな違いを見ないでしょう。同時に、結果のレポートとコードの実行のために、MATLABのインフラストラクチャが改善されます。MATLABの欠点はコストです。FORTRANは基本的に無料であり、無料のライブラリがたくさんあります。

FORTRANは非常に簡単に習得してプログラミングを開始できます。基本的には、その名前が示すとおり、数式をコードに変換し、読みやすく、理解しやすいものにします。それが物理学者が昔それをよく使っていた理由です。コードの大部分が物理的な問題の解決に関するものである限り(GUIの作成やその他のクールなことは行わない)、FORTRANコードの保守は簡単です。

Pythonをお勧めするのは、プログラミングを楽しむ場合のみです。これを考えてみてください:物理問題の解決策をコーディングするとき、その解決策の一部をプログラミングすることを楽しんでいますか?その場合、言語はMATLABの言語よりもはるかに優れているため、Pythonはオプションです。


2
一般に、MATLABからFortranへの切り替えにおけるパフォーマンスの違いに関する説明は正しくありません。Fortranは、配列が自然に優れたデータ構造であるコードを記述している場合、I / Oを処理する方法に耐えることができ、必要なライブラリがある場合に最適です。Pythonの数値ライブラリは、MATLABとの機能が大幅に重複しており、MATLABがCコードにインターフェイスするよりも、PythonをCコードにインターフェイスする方が簡単です。
ジェフオックスベリー

時々あなた多くの違いを見ます。最近、物理シミュレーションプログラムをMatlab(パッケージbvp6cを内部で使用)からFortran 2008(パッケージbvp_solverを内部で使用)に書き直しました。またはプログラムの全体構造。収束するためにデータポイントごとに〜3.5日を必要としていたシミュレーションの場合、これは非常に顕著な改善でした。
jabirali
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.