0

さまざまなデータ入力のヒープを同化することにより、電離層のほぼリアルタイムのモデルを作成するために使用されるIDL(インタラクティブデータ言語)で記述されたプロジェクトがあります。IDLは、これを記述するのに最適な言語ではありませんが、主にレガシーコードが原因です。IDLのオブジェクト環境は比較的限られていますが、プロジェクトはOOスタイルで記述されています。

このプロジェクトの次世代の範囲ははるかに大きく、はるかに多くのコンピューティングのうなり声が必要になります。IDLは、マルチスレッドからのサポートが制限されており、分散メモリシステムでの並列実行はサポートされていません。当初の計画では、MPIを使用して並列化するC ++で次世代コードを作成する予定でしたが、最近Pythonの学習を開始し、コードの迅速な開発と保守の使いやすさと機能に非常に感銘を受けました。私は現在、このプロジェクトの高レベルの部分をPythonで記述し、必要に応じてC拡張機能を使用して、コア数の処理部分の最適化を改善することを検討しています。

私はPythonを初めて使用するので、PythonがCバージョンと比較してどこで遅い可能性があるかはすぐにはわかりません(そして、Pythonの特異性を学ぶまでは、おそらくPythonで次善の策を講じます)。つまり、基本的にプロジェクト全体をPythonですべて実行するかのように計画し、コードを記述し、プロファイルを作成し、それ以上改善できなくなるまで最適化を繰り返してから、最も遅い部分を次のように置き換えることを検討します。 C拡張。

これは良いアプローチですか?この種のプロジェクトを開発するためのヒントはありますか?できるだけ多くの既存の十分に最適化されたライブラリ(scaLAPACKなど)を利用することを検討しています。これにより、数を計算するために独自のCベースの拡張機能を使用する必要性も減ります。

4

1 に答える 1

2

多くのループ、特にネストされたループを実行すると、Python は特に遅くなります

for i in x:
    for j in y:
        ....

計算量の多い問題になると、問題の 99% は、ループの代わりに numpy を使用してベクトル化された計算を行うことで解決できます。たとえば、次のようになります。

x = np.arange(1000) #numbers from 0 to 999
y = np.arange(1000, 2000) #numbers from 1000 to 1999

# slow:
for i in range(len(x)):
    y[i] += x[i]

# fast:
y += x

多くの科学的問題には、FORTRAN または C(++) で記述されたバイナリ ライブラリがあり、Python で利用できます。これにより、生活が本当に楽になります。

これが不可能な場合は、C を書かずにコア部分を C で簡単に実装できる Cython に固執します。

于 2013-01-10T11:04:20.533 に答える