Как ускорить код Numpy Python
Имеется участок кода, который необходимо ускорить без изменения его структуры. Прошу прощения, если делаю что-то неправильно
1. Исходный код:
import numpy as np
import time
N = 3*10**3
data_1 = np.arange(N)
m = np.arange(N*N)
ind_1 = np.arange(N//2)
# Здесь должен идти бесконечный цикл while True
for i in range(10):
t1 = time.time()
data = np.tile(data_1, N)
m_square = m.reshape(N, N)
M_square = m_square * data_1
d = np.sum(M_square, axis = 1)
data_1 = data_1 + d * 2.0
ind_2 = np.where(data != 0.0)[0]
m_ind = m[ind_2]
data_ind = data[ind_2]
m[ind_2] = m_ind - data_ind * 2.0
m[ind_1] = 0.0
t1 = time.time() - t1
print(t1)
2. С использованием Numexpr (немного быстрее оригинала):
import numexpr as ne
N = 3*10**3
data_1 = np.arange(N)
m = np.arange(N*N)
ind_1 = np.arange(N//2)
for i in range(10):
t2 = time.time()
data = np.tile(data_1, N)
m_square = m.reshape(N, N)
M_square = ne.evaluate('m_square * data_1')
d = np.sum(M_square, axis = 1)
data_1 = ne.evaluate('data_1 + d * 2.0')
ind_2 = np.where(data != 0.0)[0]
m_ind = m[ind_2]
data_ind = data[ind_2]
m[ind_2] = ne.evaluate('m_ind - data_ind * 2.0')
m[ind_1] = 0.0
t2 = time.time() - t2
print(t2)
3. С использованием Dask delayed (медленнее оригинала):
from dask.delayed import delayed
N = 3*10**3
data_1 = np.arange(N)
m = np.arange(N*N)
ind_1 = np.arange(N//2)
for i in range(10):
t3 = time.time()
data = delayed(np.tile)(data_1, N)
m_square = m.reshape(N, N)
M_square = delayed(m_square * data_1)
d = delayed(np.sum)(M_square, axis = 1)
data_1 = delayed(data_1 + d * 2.0)
ind_2 = np.where(data.compute() != 0.0)[0]
m_ind = delayed(m)[ind_2]
data_ind = data[ind_2]
m[ind_2] = (m_ind - data_ind * 2.0).compute()
m[ind_1] = 0.0
t3 = time.time() - t3
print(t3)
Возможно имеются более предпочтительные инструменты