Pythonを具体的に求めていることを考慮して、私はあなたの質問に答えようとします。シミュレーション問題に取り組む独自の方法を説明します。この説明では、より高速なシミュレーションのための戦略を示します。
最初に、Pythonで新しいシミュレーションのプロトタイプを作成します。もちろん、できる限りNumPyとSciPyを利用しようとしています。NumPyは数値シミュレーションに適した配列データ型を提供しますが、SciPyはNumPy配列で動作する幅広い数値ルーチンを提供します。
プロトタイプが多かれ少なかれ機能するようになったら、プログラムまたはスクリプトのどの部分がボトルネックになっているかを調べてみます。その典型的な候補があります:
- Pythonのループは遅いです。非常に遅い。
- Pythonはduck型を使用するため、関数の呼び出しが遅くなる可能性があります。
単純なプロファイリング戦略を使用して、すべての実行時間が費やされる場所を学習します。使用IPythonシェル(私は十分にお勧めすることはできません)、私は私のスクリプトを実行します
%timeit script.py
この「魔法のコマンド」は(timeitを使用して)プロファイリングを行い、スクリプトが終了した時点でリストを表示します。このリストを使用して、コードが遅すぎる場所を見つけます。
高速化が必要な部分を特定したら、コンパイル済み言語の使用を検討できます。2つの解決策を示します。
まず、Cython言語があります。CythonはPythonに非常によく似たプログラミング言語です(実際、Pythonコードは多くの場合有効なPythonコードでもあります)。ただし、CythonコンパイラーはCythonファイルをCコードに変換します。Cコードは、Pythonから使用可能なモジュールにコンパイルできます。CythonはNumPy配列を理解します。Cythonを使用すると、2つの方法が役立ちます。最初に、データ型を導入できます。これにより、関数呼び出しが高速化されます。また、配列を反復処理すると、ループの実行が高速になります(実際、ダミー変数と配列の両方を入力すると、単純なCループになります!)。第二に、私の実験では、型付けされていないスクリプトでさえ、解釈されるのではなくコンパイルされるという事実により、少し速く実行されます。
役に立つ他のコンパイル済み言語はFortranです。PythonでFortranを使用するにはさまざまな方法があります(f2py、fortwrap、Cython)。個人的には、f2pyが最も簡単な方法のように思えますが、それが何をするのかを簡単に説明します。f2pyは、FortranコードをPythonモジュールにコンパイルできます。Pythonスペースからの入力および出力変数としてNumPy配列を使用できるようになります。Fortran空間では、これらは通常のFortran配列になります。これらは、Fortranの最高速度で操作できます。
個人的には、関数呼び出しの数がボトルネックであるCythonを使用する傾向があります。ループが重いものについては、f2pyを好みます(Fortranの強力なバックグラウンドがあるためでしょう)。
Fortranに関する追加の注意事項:最新のFortranは、NumPyと非常によく似た読み取りと書き込みを行います-構文は非常に似ています。これにより、NumPyコードをFortranコードに簡単に変換できます。
Cythonとf2pyの両方が何らかの方法でパラレリズムをサポートすることに注意してください。Cythonの場合、ここでヘルプが見つかりますが、Fortranの場合、OpenMPやMPI などの標準的な手法があります。さらに、MPI用の P ythonラッパーもあります。個人的には、FortranのOpenMPと同様にPythonレベルでmpi4pyを使用しています。
H.-P.著「計算科学のためのPythonスクリプト」という本を少しお勧めします。Langtangenは、Python全般およびPythonを少し速くするための戦略に関する優れたリソースです。残念ながら、AFAIR、Cythonについては何も言及していません。2番目のリソースとして、これらのスライドをご覧ください。私はこの記事で言及したすべてのためにこれらの所与の例(またコードとソース参照ここに)。インターネットには他にも多くの優れたスライドがあります。
より具体的な質問がある場合は、喜んでお手伝いします!