为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2024-01-16 15:02:41
我目前正在使用 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我在这里做错了什么吗?
查看完整描述

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 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信