加速科学python计划

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)

npnumpy包.

我有兴趣为大小为100,000*100,000的矩阵运行此代码,但似乎这个程序没有机会快速运行(我需要多次运行,大约10,000次).

是否有可能像多线程这样的技巧在这里起作用?

还有什么有助于加速它?

ser*_*lle 8

你可以考虑使用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)