亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

已解決:在 Numba 中使用全局變量的替代方案

已解決:在 Numba 中使用全局變量的替代方案

偶然的你 2024-01-16 15:02:41
我目前正在使用 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 倍。


查看完整回答
反對 回復 2024-01-16
  • 1 回答
  • 0 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號