因此,我需要幫助,以減少僅使用 NumPy 運行包含大量資料的代碼所需的時間。我認為 for 回圈使我的代碼效率低下。但我不知道如何將 for 回圈變成串列理解,這可能有助于它運行得更快。
def lagrange_poly(p,xhat,n,x,tol):
matrix=[]
error_flag=0
er=1
for l in range(p):
if abs(xhat[l] - xhat[l 1])<tol:
error_flag=er
#base lagrange polynomial
for i in range(n):
for j in range(p 1):
L=1
for k in range(p 1):
if k!=j:
L= L*(x[i] - xhat[k])/(xhat[j] - xhat[k])
matrix.append(L)
lagrange_matrix= np.transpose(np.array(matrix).reshape(n,p 1))
return lagrange_matrix, error_flag
def uniform_poly_interpolation(a,b,p,n,x,f,produce_fig):
inter=[]
xhat=np.linspace(a,b,p 1)
#use for loop to iterate interpolant.
for j in range(n):
po=0
for i in range(p 1):
po = f(xhat[i]) * lagrange_poly(p,xhat,n,x,1e-10)[0][i,j]
inter.append(po)
interpolant = np.array(inter)
return interpolant
uj5u.com熱心網友回復:
看起來價值lagrange_poly(...)是無緣無故重新計算n*(p 1)的時間,這非常非常昂貴!您可以在回圈之前計算一次,將其存盤在變數中并稍后重用該變數。
這是固定代碼:
def uniform_poly_interpolation(a,b,p,n,x,f,produce_fig):
inter=[]
xhat=np.linspace(a,b,p 1)
#use for loop to iterate interpolant.
mat = lagrange_poly(p,xhat,n,x,1e-10)[0]
for j in range(n):
po=0
for i in range(p 1):
po = f(xhat[i]) * mat[i,j]
inter.append(po)
interpolant = np.array(inter)
return interpolant
這應該快得多。
此外,執行速度很慢,因為從 CPython 訪問 Numpy 陣列的標量值非常慢。Numpy 旨在與陣列一起使用,而不是在回圈中提取標量值。此外,回圈 CPython 解釋器相對較慢。您可以使用Numba有效地解決此問題,它使用 JIT 編譯器將您的代碼編譯為非常快速的本機代碼。
這是 Numba 代碼:
import numba as nb
@nb.njit
def lagrange_poly(p, xhat, n, x, tol):
error_flag = 0
er = 1
lagrange_matrix = np.empty((n, p 1), dtype=np.float64)
for l in range(p):
if abs(xhat[l] - xhat[l 1]) < tol:
error_flag = er
# Base lagrange polynomial
for i in range(n):
for j in range(p 1):
L = 1.0
for k in range(p 1):
if k!=j:
L = L * (x[i] - xhat[k]) / (xhat[j] - xhat[k])
lagrange_matrix[i, j] = L
return lagrange_matrix, error_flag
總的來說,這應該快幾個數量級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442913.html
上一篇:在程式集中更新陣列
