我有以下Python代码:
def P(z, u0):
x = np.inner(z, u0)
tmp = x*u0
return (z - tmp)
def powerA2(A, u0):
x0 = np.random.rand(len(A))
for i in range(ITERATIONS):
x0 = P(np.dot(A, x0), u0)
x0 = x0 / np.linalg.norm(x0)
return (np.inner(np.dot(A, x0), x0))
np
是 numpy
包。
我想在大小为 100,000 * 100,000 的矩阵上运行此代码,但似乎这个程序没有快速运行的机会(我需要运行它很多次,大约 10,000 次)。
有没有什么技巧,如多线程,在这里起作用的机会?
还有其他什么可以帮助加速吗?
ITERATIONS
循环中删除linalg.norm
行以获得适当的加速,但我猜那是为了稳定性而存在的?您可以使用x0 /= math.sqrt(np.dot(x0, x0))
而不是x0 = x0/np.linalg.norm(x0)
来加快该行的速度。通过使用out=
参数并在原地执行一些操作,可以获得更多速度。令人惊讶的是(对我来说),np.einsum
没有在任何地方提供帮助;np.inner
和np.dot
非常快。 - askewchan