0

ユニ割り当てのために、MATLAB で 2D 正方形ドメイン フロー ソルバーを作成しました。Python を勉強するために、MATLAB コードを Python に変換しました。NumPy を使用してすべての行列とベクトルの乗算を行い、scipy.sparse.linalg.spsolve() を使用して Ax=b を解決しました。ここで、A は 40x40 でスパースです。

結局、ソルバーの速度についてはあまり満足できませんでした。そこで、Spyder に含まれているプロファイラーを使用してボトルネックを突き止めました。基本的に、(前述の方法を使用した) システム ソルブを除いて、すべての線形代数操作は非常に高速であることが判明しました。システムを解くことは、いくつかのベクトルと行列を単に乗算するよりも常にコストがかかるため、驚くことではありません。

ソルバーを高速化するために Cython に目を向けました。私はhttp://wiki.cython.org/tutorials/numpyを読み、すべての変数に静的型を与えることで大騒ぎになりました(はい、これが最もスマートまたは最も効率的な方法ではないことはわかっていますが、急いで確認します結果が得られ、その後は適切な仕事をします)。静的型を指定していない唯一のものは疎行列 A です。これは CSR 疎行列であり、静的型付けの方法がまだわからないためです。プロファイリングにより、システムの解決がボトルネックであることが示されたので、それが最も重要な部分であることはわかっています。

最終的にCythonですべてをコンパイルした後、結果はCythonを使用しない場合とまったく同じでした...ボトルネックに対処しなかったため、Cythonのパフォーマンスの向上が大きくないことは理解していますが、Cythonバージョンがなぜそうしたのかわかりません1% 速くも実行されません。

誰かが Cython の恩恵を受けるのを手伝ってくれませんか? コードをより速く実行するにはどうすればよいですか? また、scipy の CSR スパース行列に静的な型を与えるにはどうすればよいですか?

私のコードは、この Google ドライブ リンクを使用してダウンロードできます: https://docs.google.com/file/d/0B-nchNKLtgjeWTE4OXZrVUpfcWs/edit?usp=sharing

4

2 に答える 2

6

ボトルネックに取り組まなかったからです。

あなたが今行ったことは、NumPy へのメソッド呼び出しを少し高速化することだけだと私には思えます。これは、NumPy に対して多くの呼び出しを行う場合にのみ役立ちますが、それはボトルネックの場所ではないと言います。

Cython を使用すると、Python コードを高速化できます。NumPy コードの高速化には役立ちません。

于 2013-05-28T02:28:40.397 に答える