【发布时间】:2021-02-21 15:13:51
【问题描述】:
我需要提高算法的速度。该方法将两个矩阵作为参数并执行点乘。唯一的问题是元素必须在 GF(256) 中作为八位字节相乘,然后作为异或相加。 由于我正在处理非常大的稀疏矩阵,因此性能很糟糕。
def matrix_oct_mult(U, V, OCT_EXP, OCT_LOG):
temp_sum = 0
if shape(U)[1] == None and shape(V)[1] == None:
for i in range(len(U)):
temp_sum = oct_sum(temp_sum, oct_mult(U[i], V[i], OCT_EXP, OCT_LOG))
return temp_sum
assert shape(U)[1] == shape(V)[0], "Wrong size requirements for matrix dot multiplication"
temp_sum = 0
W = sp.lil_matrix((shape(U)[0], shape(V)[1]))
for i in range (shape(U)[0]):
for z in range(shape(V)[1]):
for j in range (shape(U)[1]):
temp_sum = oct_sum(temp_sum, oct_mult(U[i, j], V[j, z], OCT_EXP, OCT_LOG))
W[i, z] = temp_sum
temp_sum = 0
return W
如您所见,我尝试使用 lil 类,但性能仍然很差。
有什么有效的解决办法吗?
【问题讨论】:
-
Python 不是一种编译语言,矩阵运算的嵌套循环总是异常缓慢。您应该重组您的问题以使用标准矩阵运算,或者您应该用您选择的编译语言编写它。
-
我看不出您在哪里利用
U或V或结果W的稀疏性。对于像这样的迭代,普通的ndarray(甚至列表列表)会更好。即使使用lil对稀疏矩阵的元素访问也很慢。
标签: python performance scipy sparse-matrix galois-field