我有一个python函数,想用numba来加速它。最耗时的部分是在set/dict中搜索元组。有人能告诉我们如何解决这个问题吗?在
idNeg = np.array([[1,2,3], [4,5,6], ..., [7,8,9]])
validSet = {(1,2,3):True, (5,4,3):True, ..., (2,5,3):True}
@jit
def CalcNeg(idNeg, validSet):
l = len(idNeg)
for j in xrange(l):
corplc = np.random.choice([0, 2])
idNeg[j, corplc] = random.randrange(0, VE.shape[0])
while validSet.has_key((idNeg[j, 0], idNeg[j, 1], idNeg[j, 2])):
idNeg[j, corplc] = random.randrange(0, VE.shape[0])
return idNeg
我试过这样做,但是速度没有改变,与没有@jit
的代码相比。在
我不是100%清楚所需输入(内容或典型形状)的确切性质,但是在Numba中获得良好性能提升的关键是能够在
nopython
模式下(与python对象模式相反)jit函数。最初的函数使用了数据结构,特别是dict,目前不支持。在同样,我不知道具体的用例或者下面的修改是否有效,但是我使用了
validSet
dict并将它的keys转换为一个实集对象,其中key,value对中的值是True
。在例如:
现在,使用
^{pr2}$%timeit
魔法,从ipython笔记本电脑中获得一些计时:在我的机器上是18倍的加速。我用的是Numba 0.25。请注意,切换到原始python函数中的一个集合会产生一个小的差异,但更像是25%的加速。在
如果测试数据不切实际,或者将dict转换为集合不合适,请告诉我。如果没有更多的细节,很难判断如何解决这个问题。在
相关问题 更多 >
编程相关推荐