import multiprocessing import numpy as np import time def sequential_multiply_matrix(A, B): rows_A = len(A) cols_A = len(A[0]) rows_B = len(B) cols_B = len(B[0]) if cols_A != rows_B: print("Умножение матриц невозможно.") return result_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)] for i in range(rows_A): for j in range(cols_B): for k in range(cols_A): result_matrix[i][j] += A[i][k] * B[k][j] return result_matrix def parallel_multiply_matrix(A, B, num_processes): rows_A = len(A) cols_A = len(A[0]) rows_B = len(B) cols_B = len(B[0]) if cols_A != rows_B: print("Умножение матриц невозможно.") return result_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)] chunk_size = int(rows_A / num_processes) processes = [] for i in range(num_processes): start = chunk_size * i end = chunk_size * (i + 1) if i < num_processes - 1 else rows_A p = multiprocessing.Process(target=perform_multiplication, args=(A, B, result_matrix, start, end)) processes.append(p) p.start() for p in processes: p.join() return result_matrix def perform_multiplication(A, B, result_matrix, start, end): for i in range(start, end): for j in range(len(B[0])): for k in range(len(A[0])): result_matrix[i][j] += A[i][k] * B[k][j] if __name__ == "__main__": matrix_sizes = [100, 300, 500] num_processes = 4 for n in matrix_sizes: matrix_A = np.random.randint(10, size=(n, n)) matrix_B = np.random.randint(10, size=(n, n)) start_time = time.time() sequential_result = sequential_multiply_matrix(matrix_A, matrix_B) end_time = time.time() print(f"Последовательное умножение {n}x{n} матриц заняло: {end_time - start_time} секунд") start_time = time.time() parallel_result = parallel_multiply_matrix(matrix_A, matrix_B, num_processes) end_time = time.time() print(f"Параллельное умножение {n}x{n} матриц заняло: {end_time - start_time}")