第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 numba 優(yōu)化 while 循環(huán)以實現(xiàn)容錯

使用 numba 優(yōu)化 while 循環(huán)以實現(xiàn)容錯

紫衣仙女 2022-10-18 19:46:39
我在使用 numba 進行優(yōu)化時有疑問。我正在編寫一個定點迭代來計算一個名為 gamma 的數(shù)組的值,它滿足方程 f(gamma)=gamma。我正在嘗試使用 python 包 Numba 優(yōu)化此功能??雌饋砣缦隆jitdef fixed_point(gamma_guess):    for i in range(17):        gamma_guess=f(gamma_guess)    return gamma_guessNumba 能夠很好地優(yōu)化這個功能,因為它知道它將執(zhí)行多少次操作,17 次,并且運行速度很快。但是我需要控制我想要的伽瑪?shù)恼`差容限,我的意思是,一個伽瑪和下一個通過定點迭代獲得的伽瑪之差應(yīng)該小于某個數(shù)字epsilon = 0.01,然后我嘗試了@jitdef 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它也可以工作并計算所需的結(jié)果,但不如上次實現(xiàn)快,它要慢得多。我認為這是因為 Numba 無法很好地優(yōu)化 while 循環(huán),因為我們不知道它何時會停止。有沒有辦法可以優(yōu)化它并像上次實現(xiàn)一樣快地運行?編輯:這是我正在使用的 ffrom scipy import fftpack as spS=0.01Amu=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傳遞給我的函數(shù)的其他參數(shù)是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)
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻1807條經(jīng)驗 獲得超9個贊

我做了一個小測試腳本,看看我是否可以重現(xiàn)你的錯誤:


import numba as nb


from IPython import get_ipython

ipython = get_ipython()


@nb.jit(nopython=True)

def f(x):

    return (x+1)/x



def fixed_point_for(x):

    for _ in range(17):

        x = f(x)

    return x


@nb.jit(nopython=True)

def fixed_point_for_nb(x):

    for _ in range(17):

        x = f(x)

    return x


def fixed_point_while(x):

    error=1

    x_old = x

    while error>0.01:

        x = f(x)

        error = abs(x_old-x)

        x_old = x

    return x


@nb.jit(nopython=True)

def fixed_point_while_nb(x):

    error=1

    x_old = x

    while error>0.01:

        x = f(x)

        error = abs(x_old-x)

        x_old = x

    return x


print("for loop without numba:")

ipython.magic("%timeit fixed_point_for(10)")


print("for loop with numba:")

ipython.magic("%timeit fixed_point_for_nb(10)")


print("while loop without numba:")

ipython.magic("%timeit fixed_point_while(10)")


print("for loop with numba:")

ipython.magic("%timeit fixed_point_while_nb(10)")

由于我不了解您的f情況,因此我只使用了我能想到的最簡單的穩(wěn)定功能。然后,我在使用和不numba使用循環(huán)的情況下運行測試。我機器上的結(jié)果是:forwhile


for loop without numba:

3.35 μs ± 8.72 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

for loop with numba:

282 ns ± 1.07 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

while loop without numba:

1.86 μs ± 7.09 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

for loop with numba:

214 ns ± 1.36 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

產(chǎn)生以下想法:

  • 不可能,你的函數(shù)是不可優(yōu)化的,因為你的for循環(huán)很快(至少你是這么說的;你沒有測試過numba嗎?)。

  • 如您所想,您的函數(shù)可能需要更多的循環(huán)才能收斂

  • 我們使用不同的軟件版本。我的版本是:

    • numba  0.49.0

    • numpy  1.18.3

    • python 3.8.2


查看完整回答
反對 回復(fù) 2022-10-18
  • 1 回答
  • 0 關(guān)注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號