#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)