2017-10-02 3 views
2

私は、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) 

任意の提案は感謝を歓迎しました。

答えて

3

我々は超越操作を含む大規模なデータに本当に効率的に機能numexpr moduleを、活用可能性 -

In [91]: arr = np.random.rand(2**14) + 1j *np.random.rand(2**14) 
    ...: float_value = 0.5 
    ...: 

In [92]: %timeit np.exp(float_value * arr) 
1000 loops, best of 3: 739 µs per loop 

In [94]: import numexpr as ne 

In [95]: %timeit ne.evaluate('exp(float_value*arr)') 
1000 loops, best of 3: 241 µs per loop 

これは、ドキュメントに記載されているようにexpected performanceとコヒーレントであるように思われます。

+0

ありがとうございます - このnumexprアプローチは面白そうです。私は通常Numba、Cythonなどをハイライトする最適化のための通常のオンラインガイダンスでこれを見ていませんでした。スタンドアロンの%timeitsは2倍以上の改善を示していますが、私はもっ​​と調査し、回答を返信する/受け入れるでしょう。 – SLater01

+0

@ SLater01大きなデータを扱っていますか?また、ソルバー問題の設定を大きくしてタイミングを取るときは、コードの他の部分がランタイムの大きな部分を占めている可能性があるので、この指数部のタイミングを合わせるようにしてください。 – Divakar

+1

通常は小さなピックアップだけですが、これらの関数の 'out =' paramを使って、一時配列を再利用することもできます。 – chrisb

関連する問題