Ускорьте функции numpy, зацикливайтесь на cython

#python #numpy

Вопрос:

Я пытаюсь ускорить этот следующий код, алгоритм градиентного типа. Но здесь я использую некоторые стандартные функции Numpy, это кажется довольно медленным. Я хотел бы посмотреть, можно ли скомпилировать Cython или другим эффективным способом. У меня не так много опыта в Python, поэтому я уверен, что ваш код намного лучше. Пожалуйста, помогите!

 import numpy as np 
import math 
from datetime import datetime
import random
import time

n = 100
A=np.diagflat([random.randint(1,50) for i in range(n)]) # Creat a random matrix
for i in range(100):A[random.randint(0,len(A)-1)][random.randint(0,len(A)-1)]=random.randint(1,12)
At=np.transpose(A)
b=np.random.randint(-100,100, size=(n,1))
L=2*max(np.linalg.eig(np.dot(At,A))[0]).real
mu=2*min(np.linalg.eig(np.dot(At,A))[0]).real

D = 10
N = 1000 # so vong lap
x0 = np.full((n,1), 0.5)

def fx(x):
    return 1/2*pow((np.linalg.norm(A.dot(x)-b)), 2)
def grad_f(x):
    return np.dot(At,np.dot(A,x)-b)

def non_adpt(A, x0, b):
    k = 0
    x = x0
    E = 1
    start_time=datetime.now()
    while(k<=N):
        gf=grad_f(x)
        gfw=[random.uniform(gf[i]-D/math.sqrt(n),gf[i] D/math.sqrt(n)) for i in range(n)]
        x1=x-np.multiply(1/L*(1-D/np.linalg.norm(gfw)),gfw)
        E*=1-mu/L*(((np.linalg.norm(gfw)-D)/(np.linalg.norm(gfw) D))**2)
        x=x1
        k =1
    time= (datetime.now()-start_time)
    return E, time

non_adpt(A, x0, b)
out put: 0.8894924610503078, datetime.timedelta(microseconds=541379)