gpt4 book ai didi

python - 使用 Scipy.Sparse 在 GF(256) 中进行快速稀疏矩阵点乘

转载 作者:行者123 更新时间:2023-12-05 06:57:58 26 4
gpt4 key购买 nike

我需要提高算法的速度。该方法将两个矩阵作为参数并执行点乘。唯一的问题是元素必须作为 GF(256) 中的八位字节相乘,然后作为 XOR 添加。由于我处理的是非常大的稀疏矩阵,因此性能非常糟糕。

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 是解释型的,因此嵌套的 for 循环性能不佳是出了名的。而 C 中等效的 for 循环会很快。因此,编译后的代码将带来最佳性能。

出于这个原因,我编写了一个名为 galois 的 Python 库扩展 NumPy 数组以在 Galois 域中运行。我用 Python 编写了代码,但 JIT 使用 Numba 对其进行了编译,因此 Galois 域算法与原生 NumPy 数组算法一样快,或者几乎一样快,请参阅 performance comparison .

该库支持使用标准二元运算符(+@ 等)和普通 NumPy 线性代数函数在 Galois 域矩阵上进行线性代数。这些例程中的大多数也进行了 JIT 编译以提高速度。

我相信您正在尝试对两个矩阵 ((M,N) x (N,K)) 进行矩阵乘法。这是在 galois 中执行此操作的示例。

In [1]: import galois                                                                                                                                                                          

# Create the GF(2^8) field using AES's irreducible polynomial -- your's may be different
In [2]: GF = galois.GF(2**8, irreducible_poly=0x11b)

In [3]: print(GF.properties)
GF(2^8):
characteristic: 2
degree: 8
order: 256
irreducible_poly: x^8 + x^4 + x^3 + x + 1
is_primitive_poly: False
primitive_element: x + 1

In [4]: A = GF.Random((3,4)); A
Out[4]:
GF([[ 35, 130, 167, 111],
[ 58, 161, 194, 200],
[244, 65, 160, 8]], order=2^8)

In [5]: B = GF.Random((4,5)); B
Out[5]:
GF([[ 50, 59, 23, 34, 38],
[ 16, 59, 162, 80, 250],
[205, 145, 114, 9, 40],
[212, 250, 162, 210, 72]], order=2^8)

In [6]: A @ B
Out[6]:
GF([[144, 236, 142, 90, 89],
[ 83, 171, 34, 2, 117],
[192, 1, 20, 208, 127]], order=2^8)

关于python - 使用 Scipy.Sparse 在 GF(256) 中进行快速稀疏矩阵点乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64756083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com