【发布时间】:2021-06-06 17:42:30
【问题描述】:
我是 python 新手,我正在寻找一种方法来加速我编写的以下函数:
def incoming_Wave_Vel(geom,t,phi):
x = geom[:,0].reshape(1,geom.shape[0])
y = geom[:,1].reshape(1,geom.shape[0])
z = geom[:,2].reshape(1,geom.shape[0])
q1 = k*(h+z)
q2 = omega*t-Kx*x-Ky*y+phi[:,0].reshape(phi.shape[0],1)
u = AOmega.T @ (np.cosh(q1)/np.sinh(k*h)*np.sin(q2))
w = AOmega.T @ (np.sinh(q1)/np.sinh(k*h)*np.cos(q2))
return np.vstack((u*np.cos(th),u*np.sin(th),w))*RampFun(t)
AOmega, k, Kx, Ky, omega 和 phi 是维度为 [n,1] 的数组,而 x,y,z 的维度是 [1,m]。我使用点积@ 来避免求和函数,但性能几乎相同。
我尝试使用 numba 但到目前为止所做的所有测试都失败了。
有什么改进代码的建议吗?谢谢
我在下面发布了尝试将函数与 numba 并行化:
from numba import njit, prange
@njit(fastmath=True, parallel=True)
def incoming_Wave_Vel_parallel(x,y,z,t,phi):
u = np.zeros_like(x)
w = np.zeros_like(x)
n = len(omega)
for i in prange(n):
q1 = k[i]*(h+z)
q2 = omega[i]*t-Kx[i]*x-Ky[i]*y+phi[i]
u += AOmega[i]*np.cosh(q1)/np.sinh(k[i]*h)*np.sin(q2)
w += AOmega[i]*np.sinh(q1)/np.sinh(k[i]*h)*np.cos(q2)
return np.vstack((u*np.cos(th),u*np.sin(th),w))
但是这个版本比串行版本慢。
【问题讨论】:
-
t, h, omega 和 th 是常量吗?
-
抱歉,t,h 和 th 是常量浮点数,omega 是一个数组,如 k
-
AOmega 的维度是 (n,1),但 q1 和 q2 的维度是 (n,m),这使得 u 和 v 无法计算。我错过了什么吗?
-
再次抱歉,我错过了一个 AOmega.T,在脚本中我发布的部分上方几行......所以 AOmega 是 [1,n]
-
好的,我已经开始运行了!有没有机会,您是否有任何数量级的 n 和 m,以便我们可以运行更具代表性的测试?
标签: python performance numba