我已經定義了以下功能
def laplacian_2D_array(func_2D):
func_2nd_derv_x_fin2D = np.zeros((N,N))
for j in range (0,N):
func_CD2_x_list = []
for i in range (0,N):
value = func_2D[i][j] #func_2D is a NxN matrix
func_CD2_x_list.append(value)
func_CD2_x_array = np.array (func_CD2_x_list)[np.newaxis]
func_2nd_derv_x = matrix_R @ (np.transpose(func_CD2_x_array))
func_2nd_derv_x_fin2D[j] = np.transpose (np.reshape(func_2nd_derv_x,[N,]))
func_2nd_derv_y_fin2D = np.zeros((N,N))
for i in range (0,N):
func_CD2_y_list = []
for j in range (0,N):
value = func_2D[i][j]
func_CD2_y_list.append(value)
func_CD2_y_array = np.array (func_CD2_y_list)[np.newaxis]
func_2nd_derv_y = matrix_S @ (np.transpose(func_CD2_y_array))
func_2nd_derv_y_fin2D[i] = (np.reshape(func_2nd_derv_y,[N,]))
return (np.add(func_2nd_derv_x_fin2D, func_2nd_derv_y_fin2D))
在上面的代碼中,func_2D每 j 行的 2D 矩陣被提取為列向量并與 matrix_R 相乘并存盤在第func_2nd_derv_x_fin2D2 塊代碼的第 j 列中,最后函式回傳func_2nd_derv_x_fin2D和func_2nd_derv_y_fin2D
在這個N = 401and中matrix_S,matrix_R也是 NXN 矩陣。這個函式在一個while回圈中被多次呼叫,單次迭代的執行需要很多時間。我試圖@njit讓它更快,但我沒有成功這樣做并得到錯誤。我也嘗試過使用cache.
我們如何在此優化串列和陣列,還有哪些其他方法可以優化定義的函式?
我正在顯示使用該函式的代碼。
while (time<timemax):
#Analytical Solution----------------------------------------------------------------------------
exact_time = time/a_sec
omega_t = np.zeros((N,N))
psi_t = np.zeros((N,N))
for i in range (0,N):
for j in range (0,N):
psi_t[i][j] = np.sin(x_list[i]) * np.sin(y_list[j]) * np.exp((-2*exact_time)/Re)
omega_t[i][j] = 2*np.sin (x_list[i]) * np.sin(y_list[j]) * np.exp((-2*exact_time)/Re)
.
.
.
.
.
.
.
# BiCGSTAB algo
x0 = psi_0 #initial guess--> psi of previous time step
r0 = omega_0 - laplacian_2D_array(x0) # r0 = b-Ax0
r0_hat = r0
rho_0 = 1
alpha = 1
w0 = 1
v0 = np.zeros((N,N))
P_0 = np.zeros((N,N))
tol = 10 ** (-7)
iteration = 0
while ((np.max(np.abs(laplacian_2D_array(x0) - omega_0))) < tol):
rho_prev = rho_0
rho = np.dot ((np.reshape(r0_hat,(N**2,1))),(np.reshape(r0,(N**2,1))))
beta = (rho/rho_prev) * (alpha/w0)
P_0 = r0 beta * (P_0 - w0 * v0)
v0 = laplacian_2D_array(P_0)
alpha = rho / np.dot ((np.reshape(r0_hat,(N**2,1))),(np.reshape(v0,(N**2,1))))
s = r0 - alpha * v0
t = laplacian_2D_array(s)
任何固定代碼的建議都是非常值得贊賞的。
uj5u.com熱心網友回復:
事實證明,復雜的代碼laplacian_2D_array可以簡化為以下實作:
def laplacian_2D_array(func_2D):
return (matrix_R @ func_2D matrix_S @ func_2D.T).T
根據您提供的輸入,這在我的機器上在隨機矩陣上快了 63 倍。大部分時間應該花在矩陣乘法上(如果在目標平臺上正確安裝了 Numpy/Python/BLAS,則并行執行非常有效)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/452140.html
上一篇:Python將數字串列串列的字串轉換為實際的數字串列串列
下一篇:不使用append()反轉串列
