@jit("float32[:](float32,float32,intp)", nopython=False, nogil=True)
def calc_func(a, b, n):
res = np.empty(n, dtype="float32")
res[0] = 0
for i in range(1, n):
res[i] = a * res[i - 1] + (1 - a) * (b ** (i - 1))
return res
a = calc_func(0.988, 0.9988, 5000)
我收到了一堆警告/错误,但并不太明白。希望能得到帮助来解释它们,并使它们消失,以加快计算速度。
以下是这些警告/错误:
NumbaWarning: 编译正在回退到启用循环提升的对象模式,因为“calc_func”函数由于以下原因未通过类型推断:使用无效的Function()参数类型:(int64, dtype=Literalstr) * 参数化
在定义0中: 所有模板都被字面量拒绝。
在定义1中: 所有模板都没有字面量被拒绝。 这个错误通常是由于传递了一个不受命名函数支持的类型的参数而引起的。
[1] 在:解析调用者类型时
[2] 在:
res = np.empty(n, dtype="float32")
的调用类型文件“thenameofmyscript.py”,第71行:
def calc_func(a, b, n):
res = np.empty(n, dtype="float32")
^
@jit("float32:", nopython=False, nogil=True)
thenameofmyscript.py:69: NumbaWarning: 编译回退到对象模式,因为函数“calc_func”的类型推断失败,原因是无法确定
<class 'numba.dispatcher.LiftedLoop'>
的Numba类型File "thenameofmyscript.py", line 73:
def calc_func(a, b, n):
<source elided>
res[0] = 0
for i in range(1, n):
^
@jit("float32:", nopython=False, nogil=True)
H:\projects\decay-optimizer\venv\lib\site-packages\numba\compiler.py:742: NumbaWarning: 函数 "calc_func" 在未使用 forceobj=True 的情况下以对象模式编译,但已升级循环。
文件 "thenameofmyscript.py",行 70:
@jit("float32[:](float32,float32,intp)", nopython=False, nogil=True)
def calc_func(a, b, n):
^
self.func_ir.loc))
H:\projects\decay-optimizer\venv\lib\site-packages\numba\compiler.py:751: NumbaDeprecationWarning: 检测到从nopython编译路径回退到对象模式编译路径,这是不推荐的行为。
文件"thenameofmyscript.py",第70行:
@jit("float32[:](float32,float32,intp)", nopython=False, nogil=True)
def calc_func(a, b, n):
^
警告:warnings.warn(errors.NumbaDeprecationWarning(msg, self.func_ir.loc))
thenameofmyscript.py:69: NumbaWarning: 代码在对象模式下运行,即使nogil=True也不允许并行执行。 @jit("float32:", nopython=False, nogil=True)
np.empty(n, dtype="float32")
将其更改为np.empty(n,dtype=np.float32)
,正如您在numpy中通常所做的那样。"float32[:](float32,float32,intp)"