私は、scipyのcomplex_odeを使ってODEを統合するコードを開発しています。ここで、integrandにはフーリエ変換と指数演算子があり、値。パフォーマンスを最適化するためにPythonの大きな複合配列の指数関数[exp()]を計算する最も速い方法
、私はこれをプロファイリングし、主なボトルネックはラインに(PyFFTWなどを使用してFFTを最適化した後)であることがわかりました。
val = np.exp(float_value * arr)
私は現在、私はコールのCコードを理解しているnumpyのを使用しています - したがって、すばやくすべきです。しかし、パフォーマンスをさらに向上させる方法はありますか?
私はNumbaを使ってみましたが、私のメインループにはFFTも含まれているので、コンパイルできないと思います(nopython = Trueフラグがエラーにつながります)。ここで
は私が最適化したいコードのテストの例です:
arr = np.random.rand(2**14) + 1j *np.random.rand(2**14)
float_value = 0.5
%timeit np.exp(float_value * arr)
任意の提案は感謝を歓迎しました。
ありがとうございます - このnumexprアプローチは面白そうです。私は通常Numba、Cythonなどをハイライトする最適化のための通常のオンラインガイダンスでこれを見ていませんでした。スタンドアロンの%timeitsは2倍以上の改善を示していますが、私はもっと調査し、回答を返信する/受け入れるでしょう。 – SLater01
@ SLater01大きなデータを扱っていますか?また、ソルバー問題の設定を大きくしてタイミングを取るときは、コードの他の部分がランタイムの大きな部分を占めている可能性があるので、この指数部のタイミングを合わせるようにしてください。 – Divakar
通常は小さなピックアップだけですが、これらの関数の 'out =' paramを使って、一時配列を再利用することもできます。 – chrisb