Слишком большое время выполнения кода, домашнее задание по физикеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Слишком большое время выполнения кода, домашнее задание по физике

Сообщение Anonymous »

Я пытаюсь сделать домашнее задание по физике на Python. Я написал следующий код:
t1=time.time()

Код: Выделить всё

def F(Sa,Sb):
if Sa > Sb:
return Sa + np.log(1 + np.exp(Sb - Sa))
else:
return Sb + np.log(1 + np.exp(Sa - Sb))

def Stirling(n): #aproximaçao de Stirling
if n == 0:
return 0
else:
return n * np.log(n) - n  + 1/2 * np.log(2*np.pi*n)

spins = np.array([-2,-1,0,1,2])

def Omega(Mi,N):

VStirling = np.vectorize(Stirling)
Log_Omega_M = -np.inf*np.ones(len(Mi))

for N_2minus in range(N+1):
for N_1minus in range( N - N_2minus + 1):
for N_0 in range(N- N_2minus - N_1minus +1):
for N_1plus in range(N- N_2minus - N_1minus - N_0 + 1):

N_2plus = N- N_2minus - N_1minus - N_0 - N_1plus

N_alphas = np.array([N_2minus, N_1minus, N_0, N_1plus, N_2plus])

M = np.sum(N_alphas*spins)

index = np.where(Mi == M)

s = VStirling(N)  #O numerador do quociente

s -= np.sum(VStirling(N_alphas))

Log_Omega_M[index] = F(Log_Omega_M[index],s)

return np.exp(Log_Omega_M)

N = 64
Ms = np.arange(-2*N, 2*N + 1)

Res= Omega(Ms,N)

print(np.sum(Res)/(5**N))

t2=time.time()
print(t2-t1)
Код хорош, но с большим N все начинает работать очень медленно. Для N>50 бег занимает более минуты, а для N=100 бег занимает около 10 метров. Есть ли способ ускорить мой код? Я думал об использовании np.meshgrid(), но не знаю как.

Подробнее здесь: https://stackoverflow.com/questions/792 ... s-homework
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»