#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)