努巴';fied函数在for循环中的计算方式不同于纯Python函数

努巴';fied函数在for循环中的计算方式不同于纯Python函数,python,numpy,numba,Python,Numpy,Numba,我使用numba来加速函数,包括许多for循环。然后在外部为循环调用它们 在循环中调用时,其中一个函数的计算结果与非JIT函数的计算结果不同 职能: def collison(u, v, f, feq, omega, w, cx, cy, n, m): for i in range(0, n): for j in range(0, n): t1 = u[i,j]*u[i,j] + v[i,j]*v[i,j] for k in

我使用numba来加速函数,包括许多for循环。然后在外部为循环调用它们

在循环中调用时,其中一个函数的计算结果与非JIT函数的计算结果不同

职能:

def collison(u, v, f, feq, omega, w, cx, cy, n, m):
    for i in range(0, n):
        for j in range(0, n):
            t1 = u[i,j]*u[i,j] + v[i,j]*v[i,j]
            for k in range(9):
                t2 = u[i,j]*cx[k] + v[i,j]*cy[k]
                feq[k,i,j] = rho[i,j]*w[k]*(1. + 3.*t2 + 4.5*t2**2 - 1.5*t1)
                f[k,i,j] = omega*feq[k, i, j] + (1. - omega)*f[k, i, j]
    return f
u
v
-ndarray n x m
f
feq
-ndarray 9 x n x m

我只是在声明之前添加了decorator:
@nb.jit(nopython=True)

循环:

for tstep in range(mstep):
    fk = collison(u, v, fw, feq, omega, w, cx, cy, n, m)
    fs = stream(fk, n, m)
    fw = wbrzeg(fs, n, m, u0)
    rho, u, v = rhouv(fw, rho, u, v, cx, cy, n, m)

可能是调用
collision
时,
fw
没有被更新吗?

我不太清楚您在这里想做什么,但是在tstep循环中,fw应该通过碰撞进行更改,但是在wbrzeg再次更改之前(不管是什么),它从未实际使用过。所以,在您的代码中,fw是否被碰撞更新实际上并不重要


这可能只是您示例中某个地方的一个typeo,但修复它可能会帮助真正理解您的问题的人(即不是我).

在jitted函数中,
rho
在Numba编译函数时被视为常量。这与非jitted函数不同,后者总是考虑更新的
rho

请参阅Numba常见问题解答中的