Как я могу заставить код умножения матрицы выполняться параллельно?

#python #matrix

#python #матрица

Вопрос:

У меня есть блок кода, который принимает вводимые пользователем данные и создает их в виде матриц, но мне нужно, чтобы они выполнялись параллельно в соответствии с выполнением кода как единого процесса. Я понятия не имею, как это сделать, я начал читать в NumPy, но на самом деле не понял этого.

 import timeit
start = timeit.default_timer()

def getMatrix(name):
    matrixCreated = []
    i = 0
    while True:
        i  = 1
        row = input('nEnter elements in row %s of Matrix %s (separated by commas)nOr -1 to exit: ' % (i, name))
        if row == '-1':
            break
        else:
            strList = row.split(',')
            matrixCreated.append(list(map(int, strList)))
return matrixCreated


def getColAsList(matrixToManipulate, col):
    myList = []
    numOfRows = len(matrixToManipulate)
    for i in range(numOfRows):
        myList.append(matrixToManipulate[i][col])
    return myList


def getCell(matrixA, matrixB, r, c):
    matrixBCol = getColAsList(matrixB, c)
    lenOfList = len(matrixBCol)
    productList = [matrixA[r][i] * matrixBCol[i] for i in range(lenOfList)]
    return sum(productList)


matrixA = getMatrix('A')
matrixB = getMatrix('B')

rowA = len(matrixA)
colA = len(matrixA[0])
rowB = len(matrixB)
colB = len(matrixB[0])

result = [[0 for p in range(colB)] for q in range(rowA)]

if (colA != rowB):
    print('The two matrices cannot be multiplied')
else:
    print('nThe result is')
    for i in range(rowA):
        for j in range(colB):
            result[i][j] = getCell(matrixA, matrixB, i, j)
        print(result[i])

stop = timeit.default_timer()
print('Time: ', stop - start)
  

У меня также есть таймер в коде для определения затраченного времени, но поскольку это программа, которая принимает пользовательский ввод, она напрямую связана с тем, сколько времени требуется для обработки в режиме реального времени, есть ли способ, которым я могу время просто выполнить? Мне нужно сравнить, как параллельный запуск этого кода может уменьшить время выполнения.

Ответ №1:

numpy это эффективная реализация на C, в то время jax как это эффективная параллельная реализация, которая также поддерживает GPU / TPU.

Оба варианта будут выполняться быстрее, чем ваша текущая python реализация.

Импортировать numpy или jax

 import numpy as np
  

или

 import jax.numpy as np
  

Затем создайте матрицы

 A = np.array(getMatrix('A'))
B = np.array(getMatrix('B'))
  

И вывести умножение матрицы

 C = A @ B
print (C)
  

Комментарии:

1. Хороший ответ, предоставляющий решение! но не совсем то, что было задано.. Я бы не осмелился понизить голос, но я чувствую, что 780 хочет реализовать его на Python. Я не программист на Python, но я бы предположил, что внутренняя часть вашего A @ B — это то, что ищет 780 APM. Это потребовало бы умножения столбцов и строк для точечного произведения в отдельных задачах (?)

2. Как именно я мог бы реализовать это в своем коде? Кажется, я тоже не могу установить NumPy, думаю, я немного не в себе, лол.

Ответ №2:

Если вам нужно только время выполнения умножения матрицы, чем переместить начало после ввода пользователем, вот так:

 ...
matrixA = getMatrix('A')
matrixB = getMatrix('B')

start = timeit.default_timer()    

rowA = len(matrixA)
colA = len(matrixA[0])
rowB = len(matrixB)
colB = len(matrixB[0])

...

stop = timeit.default_timer()
print('Time: ', stop - start)