Задать вопрос
@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.')
  • Вопрос задан
  • 643 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 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...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы