【发布时间】:2020-04-22 17:25:09
【问题描述】:
我在使用 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)
【问题讨论】:
-
This 建议,浮点比较在
numba中要慢得多,所以也许您必须将浮点比较转换为整数 1 -
我尝试修改我的函数只做整数比较,但似乎没有帮助
-
如果你使用
gamma_old=gamma_guess而不是gamma_old=gamma_guess.copy()会发生什么?我看不出抄袭的理由。今晚晚些时候我可能有时间自己尝试一些解决方案 -
是的,抱歉,我养成了一个习惯,因为有时事情不起作用,它解决了一些问题,但这次删除它似乎没有任何改变。非常感谢您以后自己尝试。
-
现在,我发布了我的答案;你为什么用
np.max?
标签: python python-3.x numpy numba