我目前正在使用 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 倍。
添加回答
举报
0/150
提交
取消