如何提高此python代码的性能

时间:2019-02-16 14:26:38

标签: python performance loops numpy numba

我有一个28000x300大小的矩阵,名为Gloves_vecs。这个想法是计算所有其他行的损失,并相应地更新它们。这是执行此操作的功能。

wrap_content

我正在使用numba和numpy。我发现使用numba编写自己的点乘积函数可以稍微加快np.dot的速度。元素明智的减法也是如此。 这都是这些功能

@njit(nopython=True, fastmath=True)
def return_loss(length, cooccur, glove_vecs, bias, alpha, epochs):
    #Calculate Loss
    for epoch in range(epochs):
        total_loss = 0
        for i in range(length):
            for j in range(length):
                loss = dot(glove_vecs[i], glove_vecs[j]) + bias[i] + bias[j] - cooccur[i][j]
                mul, temp = alpha * loss, glove_vecs[j]
                glove_vecs[j] = element_wise_subtract(glove_vecs[j], mul, glove_vecs[i])
                glove_vecs[i] = element_wise_subtract(glove_vecs[i], mul, temp)
                bias[i], bias[j] = bias[i] - mul, bias[j] - mul
                total_loss+= 0.5 * (loss**2)
        print(total_loss, epoch)
    return glove_vecs

当前,运行1个纪元即外部循环需要近12分钟。我尝试使用@njit(nopython=True, fastmath=True) def dot(v1, v2): out = 0 for k in range(len(v1)): out+= v1[k] * v2[k] return out @njit(nopython=True, fastmath=True) def element_wise_subtract(v1, mul, v2): for k in range(len(v1)): v1[k]-= mul * v2[k] return v1 的numba parallel=True模式,但是它在提高性能的同时还给出了错误的结果。 是否可以在prange函数中避免两个内部for循环?还是有其他方法可以减少所需时间?

0 个答案:

没有答案