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

我目前正在使用 scipy minimize 来解决我的优化问题,但计算时间很长。我遇到了 numba,它可以用来减少计算时间。但是当我尝试在目标函数上使用它时,它会抛出以下错误。

TypingError:在 nopython 模式管道中失败(步骤:在降低之前确保 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


我在这里做错了什么吗?


偶然的你
浏览 164回答 1
1回答

小唯快跑啊

解决了错误。numba 似乎不支持“/”运算符。因此,我们需要在需要的地方使用 np.divide 。以下是更新后的代码@jit(float64(float64[:], int64), nopython=True, parallel=True)def rosenbrock(x, N):&nbsp; &nbsp; out = 0.0&nbsp; &nbsp; for i in range(N-1):&nbsp; &nbsp; &nbsp; &nbsp; out += np.divide(100.0 * (x[i+1] - x[i]**2)**2, (1 - x[i])**2)&nbsp; &nbsp; return out结果:没有 Numba:78.4 ms ± 1.23 ms per loop&nbsp;与 Numba 一起:6.59 ms ± 152 µs per loop&nbsp;这几乎使计算时间缩短了 10 倍。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python