在Python中计算大型复杂数组的指数[exp()]函数的最快方法

SLa*_*r01 5 python optimization numpy ode numba

我正在开发使用 scipy 的 complex_ode 集成 ODE 的代码,其中被积函数包括傅立叶变换和作用于大量复数值的指数运算符。

为了优化性能,我已经对此进行了分析,发现主要瓶颈是(在使用 PyFFTW 等优化 FFT 之后):

val = np.exp(float_value * arr)
Run Code Online (Sandbox Code Playgroud)

我目前正在使用 numpy,我理解它称为 C 代码 - 因此应该很快。但是有什么办法可以进一步提高性能吗?

我已经研究过使用 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)
Run Code Online (Sandbox Code Playgroud)

任何建议欢迎感谢。

Div*_*kar 4

我们可以利用numexprmodule,它在涉及先验操作的大数据上非常有效地工作 -

\n\n
In [91]: arr = np.random.rand(2**14) + 1j *np.random.rand(2**14)\n    ...: float_value = 0.5\n    ...: \n\nIn [92]: %timeit np.exp(float_value * arr)\n1000 loops, best of 3: 739 \xc2\xb5s per loop\n\nIn [94]: import numexpr as ne\n\nIn [95]: %timeit ne.evaluate(\'exp(float_value*arr)\')\n1000 loops, best of 3: 241 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

这似乎与expected performance文档中所述一致。

\n