其他分享
首页 > 其他分享> > Numba函数比C慢,并且循环重新排序进一步减慢了x10

Numba函数比C慢,并且循环重新排序进一步减慢了x10

作者:互联网

以下代码模拟从一组图像中的不同位置提取二进制字.

Numba包装函数,以下代码中的wordcalc,有两个问题:

>与C中的类似实现相比,它慢了3倍.
>最奇怪的是,如果切换“ ibase”和“ ibit” for循环的顺序,则速度下降10倍(!).在不受影响的C实现中不会发生这种情况.

我正在使用WinPython 2.7中的Numba 0.18.2

是什么原因造成的?

imDim = 80
numInsts = 10**4
numInstsSub = 10**4/4
bitsNum = 13;

Xs = np.random.rand(numInsts, imDim**2)       
iInstInds = np.array(range(numInsts)[::4])
baseInds = np.arange(imDim**2 - imDim*20 + 1)
ofst1 = np.random.randint(0, imDim*20, bitsNum)
ofst2 = np.random.randint(0, imDim*20, bitsNum)

@nb.jit(nopython=True)
def wordcalc(Xs, iInstInds, baseInds, ofst, bitsNum, newXz):
    count = 0
    for i in iInstInds:
        Xi = Xs[i]        
        for ibit in range(bitsNum):
            for ibase in range(baseInds.shape[0]):                    
                u = Xi[baseInds[ibase] + ofst[0, ibit]] > Xi[baseInds[ibase] + ofst[1, ibit]]
                newXz[count, ibase] = newXz[count, ibase] | np.uint16(u * (2**ibit))
        count += 1
    return newXz

ret = wordcalc(Xs, iInstInds, baseInds, np.array([ofst1, ofst2]), bitsNum, np.zeros((iInstInds.size, baseInds.size), dtype=np.uint16))

解决方法:

通过将np.uint16(u *(2 ** ibit))更改为np.uint16(u << ibit),我得到了4倍的提速.也就是说,将2的幂乘以一个位移,该位移应等效(对于整数). 您的C编译器似乎很可能自己进行了替换. 交换两个循环的顺序对于我的原始版本(5%)和我的优化版本(15%)来说对我来说都是很小的差别,因此我认为我不能对此发表有用的评论. 如果您真的想比较Numba和C,则可以在导入Numba之前通过执行os.environ [‘NUMBA_DUMP_ASSEMBLY’] =’1’来查看已编译的Numba函数. (尽管这显然很复杂). 作为参考,我使用的是Numba 0.19.1.

标签:performance,numba,python
来源: https://codeday.me/bug/20191120/2041638.html