我在使用 numba 进行优化时有疑问。我正在编写一个定点迭代来计算一个名为 gamma 的数组的值,它满足方程 f(gamma)=gamma。我正在尝试使用 python 包 Numba 优化此功能。看起来如下。
@jit
def fixed_point(gamma_guess):
for i in range(17):
gamma_guess=f(gamma_guess)
return gamma_guess
Numba 能够很好地优化这个功能,因为它知道它将执行多少次操作,17 次,并且运行速度很快。但是我需要控制我想要的伽玛的误差容限,我的意思是,一个伽玛和下一个通过定点迭代获得的伽玛之差应该小于某个数字epsilon = 0.01,然后我尝试了
@jit
def fixed_point(gamma_guess):
err=1000
gamma_old=gamma_guess.copy()
while(error>0.01):
gamma_guess=f(gamma_guess)
err=np.max(abs(gamma_guess-gamma_old))
gamma_old=gamma_guess.copy()
return gamma_guess
它也可以工作并计算所需的结果,但不如上次实现快,它要慢得多。我认为这是因为 Numba 无法很好地优化 while 循环,因为我们不知道它何时会停止。有没有办法可以优化它并像上次实现一样快地运行?
编辑:
这是我正在使用的 f
from scipy import fftpack as sp
S=0.01
Amu=0.7
@jit
def f(gammaa,z,zal,kappa):
ka=sp.diff(kappa)
gamma0=gammaa
for i in range(N):
suma=0
for j in range(N):
if (abs(j-i))%2 ==1:
if((z[i]-z[j])==0):
suma+=(gamma0[j]/(z[i]-z[j]))
gamma0[i]=2.0*Amu*np.real(-(zal[i]/z[i])+zal[i]*(1.0/(2*np.pi*1j))*suma*2*h)+S*ka[i]
return gamma0
我总是用作初始猜测,np.ones(2048)*0.5传递给我的函数的其他参数是z=np.cos(alphas)+1j*(np.sin(alphas)+0.1)、zal=-np.sin(alphas)+1j*np.cos(alphas)和kappa=np.ones(2048)alphas=np.arange(0,2*np.pi,2*np.pi/2048)
函数式编程
相关分类