Как ускорить код 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)

Возможно имеются более предпочтительные инструменты


Ответы (0 шт):