ускорить конечно-разностную модель - PullRequest
0 голосов
/ 19 мая 2018

У меня есть сложная модель конечных разностей, которая написана на python с использованием той же общей структуры, что и приведенный ниже пример кода.Он имеет два цикла for, по одному для каждой итерации, а затем в каждой итерации цикл для каждой позиции в массиве x.В настоящее время выполнение кода занимает два (возможно, из-за циклов for).Есть ли простая техника, чтобы использовать numpy для удаления второго цикла for?

Ниже приведен простой пример общей структуры, которую я использовал.

import numpy as np

def f(x,dt, i):
   xn = (x[i-1]-x[i+1])/dt # a simple finite difference function
   return xn

x = np.linspace(1,10,10) #create initial conditions with x[0] and x[-1] boundaries
dt = 10 #time step
iterations = 100 # number of iterations

for j in range(iterations):
    for i in range(1,9): #length of x minus the boundaries
        x[i] = f(x, dt, i) #return new value for x[i]

У кого-нибудь есть идеи или комментарии о том, как я могу сделать это более эффективным?

Спасибо,

Робин

1 Ответ

0 голосов
/ 19 мая 2018

Для начинающих это небольшое изменение в структуре повышает эффективность примерно на 15%.Я не удивлюсь, если этот код может быть дополнительно оптимизирован, но это, скорее всего, будет алгоритмический внутри функции, то есть какой-то способ упростить работу элемента массива.Использование генератора может также помочь.

import numpy as np
import time

time0 = time.time()


def fd(x, dt, n):  # x is an array, n is the order of central diff
    for i in range(len(x)-(n+1)):
        x[i+1] = (x[i]-x[i+2])/dt # a simple finite difference function
    return x


x = np.linspace(1, 10, 10)  # create initial conditions with x[0] and x[-1] boundaries
dt = 10 # time step
iterations = 1000000 # number of iterations

for __ in range(iterations):
        x = fd(x, dt, 1)
print(x)

print('time elapsed: ', time.time() - time0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...