我目前正在使用 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
我在这里做错了什么吗?
小唯快跑啊
相关分类