Задать вопрос
@li275

Как ускорить перемножение матриц в numpy?

здравствуйте! помогите пожалуйста

У меня есть 2 матрицы размером 2500*2500, заполненные с случными числами от 0 до 500. Сначала матрицы A и B разделяю на подматрицы с помощью numpy.array_slit. Потом умножаю подматрицы с помощью dot в одном потоке. Eсли так сделать, то уходит много времени.
Хочу сделать умножение подматриц в отдельных потоках. То есть например мартрицу А разделяю на две части на a1 и a2. Также B матрицу разделяю на b1 и b1. Хочу в tread1 умножить a1 и b1, в tread2 умножить a2 и b2. Как это реализовать? Какой нибудь метод есть в numpy, что отдельно умножить подматрицы?

вот код:
import threading
import numpy as np
import timeit
import time

thread_lock = threading.Lock()

class MyThread(threading.Thread):
    def __init__(self, name, delay, a, b):
        threading.Thread.__init__(self)

        self.name = name
        self.delay = delay
        self.a= a
        self.b = b

    def run(self):
        print('Starting thread %s.' % self.name)

        thread_lock.acquire()
        matrix_multiplctn(self.a,self.b, self.delay)
        thread_lock.release()
        print('Finished thread %s.' % self.name )

def matrix_multiplctn(a, b, delay):

    a1=np.array_split(a, 2, axis=1) #разделяю по столбцам
    b1=np.array_split(b, 2, axis=0) #разделяю по строкам

    start_time = timeit.default_timer()
    c = np.dot(a1,b1)
    print(timeit.default_timer() - start_time)
    time.sleep(delay)
    print(c)
   
a=np.random.randint(0,500, size=(2500,2500))
b=np.random.randint(0,500, size=(2500,2500))

thread = MyThread("A",  0.1, a, b)
start_time1 = timeit.default_timer()
thread.start()
thread.join()
print("Время выполнения A: ", timeit.default_timer() - start_time1)
print('Finished.')
  • Вопрос задан
  • 692 просмотра
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Решения вопроса 1
adugin
@adugin Куратор тега Python
Не нужно этого делать.

Во-первых, следует учитывать важность row-major и column-major order в этой операции:
5da1a98421c64984085602.png

Во-вторых, переход от int32 к float32 (или float64) даёт радикальное ускорение за счёт BLAS:
5da1c7d110982244427246.png

BLAS уже используется в numpy "под капотом" (по крайней мере, в дистрибутиве Anaconda), поэтому не следует явным образом вызывать эти функции вручную - как показано выше, это будет медленее.

5da1bf09df2f7466403215.png
P.S. Теория вкратце:
Performance Tips of NumPy ndarray
Understanding the internals of NumPy to avoid unne...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽