我目前正在使用 scipy minimize 來解決我的優化問題,但計算時間很長。我遇到了 numba,它可以用來減少計算時間。但是當我嘗試在目標函數上使用它時,它會拋出以下錯誤。TypingError:在 nopython 模式管道中失?。ú襟E:在降低之前確保 IR 合法)不支持使用反射列表(int64)<iv = None>類型,分配給全局變量“wInt”,因為考慮了全局變量編譯時常量,并且沒有已知的方法可以將反射列表(int64)<iv=None>類型編譯為常量。這是我當前用于目標函數的示例代碼。#x is a list returned by a function and is run only once at the # -beginning of the code execution.x = someFunc()@jit(float64(int64), nopython=True, parallel=True)def fast_rosenbrock(N): out = 0.0 for i in range(N-1): out += 100.0 * (x[i+1] - x[i]**2)**2 / (1 - x[i])**2 return out目標函數利用通過調用函數獲得的全局變量。我擔心如果我將其設置為本地,則會重復計算相應的值,我想避免這種情況,因為該函數非常大并且只需要運行一次。我該如何解決這個問題?編輯1:嘗試傳遞 x 作為參數。它可以在沒有 numba 的情況下工作,但是當我將其放入 jitted 函數中時,它會拋出錯誤。沒有 numba,我得到了想要的結果:def fast_rosenbrock(x, N): out = 0.0 for i in range(N-1): out += 100.0 * (x[i+1] - x[i]**2)**2 / (1 - x[i])**2 return out與麻木:from numba import jit, float64, int64@jit(float64(float64[:], int64), nopython=True, parallel=True)def fast_rosenbrock(x, N): out = 0.0 for i in range(N-1): out += 100.0 * (x[i+1] - x[i]**2)**2 / (1 - x[i])**2 return out這會引發一個錯誤,指出ZeroDivisionError: division by zero我在這里做錯了什么嗎?
1 回答

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊
解決了錯誤。numba 似乎不支持“/”運算符。因此,我們需要在需要的地方使用 np.divide 。以下是更新后的代碼
@jit(float64(float64[:], int64), nopython=True, parallel=True)
def rosenbrock(x, N):
out = 0.0
for i in range(N-1):
out += np.divide(100.0 * (x[i+1] - x[i]**2)**2, (1 - x[i])**2)
return out
結果:
沒有 Numba:78.4 ms ± 1.23 ms per loop
與 Numba 一起:6.59 ms ± 152 μs per loop
這幾乎使計算時間縮短了 10 倍。
添加回答
舉報
0/150
提交
取消