Numba'fied函数在for循环和纯Python函数中的求值不同

时间:2015-11-06 14:58:40

标签: python numpy numba

我正在使用numba来加速包括许多for循环在内的函数。比在外面叫他们循环。

其中一个函数在循环调用时以不同的方式评估一个函数。

功能:

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

uv - ndarray n x m ffeq - ndarray 9 x n x m

我只是在声明之前添加装饰器:@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)

调用fw时,collision是否未更新?

2 个答案:

答案 0 :(得分:3)

在Numba编译函数时,jitted函数rho被视为常量。这与始终考虑更新的rho

的非jitted函数不同

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

答案 1 :(得分:0)

我并不完全确定你在这里尝试做什么,但是在tstep循环中,fw应该通过碰撞来改变,但是直到它之后它才会被实际使用过。'由wbrzeg(无论是什么)改变了。所以,在你的代码中,如果通过碰撞更新fw,它实际上并不重要......

这可能只是你的例子中的某个类型,但修复可能有助于实际了解你的问题的人(即不是我)......