Som*_*AHA 3 python numpy scientific-computing
我在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))
Run Code Online (Sandbox Code Playgroud)
np是numpy包.
我有兴趣为大小为100,000*100,000的矩阵运行此代码,但似乎这个程序没有机会快速运行(我需要多次运行,大约10,000次).
是否有可能像多线程这样的技巧在这里起作用?
还有什么有助于加速它?
你可以考虑使用Pythran.编译以下代码(norm.py):
#pythran export powerA2(float [][], float[])
import numpy as np
def P(z, u0):
x = np.inner(z, u0)
tmp = x*u0
return (z - tmp)
def norm(x):
return np.sqrt(np.sum(np.abs(x)**2))
def powerA2(A, u0):
ITERATIONS = 100
x0 = np.random.random(len(A))
for i in range(ITERATIONS):
x0 = P(np.dot(A, x0), u0)
x0 = x0 / norm(x0)
return (np.inner(np.dot(A, x0), x0))
Run Code Online (Sandbox Code Playgroud)
有:
pythran norm.py
Run Code Online (Sandbox Code Playgroud)
产生以下加速:
$ python -m timeit -s 'import numpy as np; A = np.random.rand(100, 100); B = np.random.random(100); import norm' 'norm.powerA2(A, B)'
100 loops, best of 3: 3.1 msec per loop
$ pythran norm.py -O3 -march=native
$ python -m timeit -s 'import numpy as np; A = np.random.rand(100, 100); B = np.random.random(100); import norm' 'norm.powerA2(A, B)'
1000 loops, best of 3: 937 usec per loop
Run Code Online (Sandbox Code Playgroud)