import multiprocessing import numpy as np import time def multiply_matrices(matrix_a, matrix_b): if len(matrix_a[0]) != len(matrix_b): raise ValueError("матрицы имеют разную длину") result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))] for i in range(len(matrix_a)): for j in range(len(matrix_b[0])): for k in range(len(matrix_b)): result[i][j] += matrix_a[i][k] * matrix_b[k][j] return result def multiply_row(args): matrix_a, matrix_b, i = args row_result = [0 for _ in range(len(matrix_b[0]))] for j in range(len(matrix_b[0])): for k in range(len(matrix_b)): row_result[j] += matrix_a[i][k] * matrix_b[k][j] return row_result, i def multiply_matrices_parallel(matrix_a, matrix_b, threads): if len(matrix_a[0]) != len(matrix_b): raise ValueError("матрицы имеют разную длину") result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))] with multiprocessing.Pool(processes=threads) as pool: args_list = [(matrix_a, matrix_b, i) for i in range(len(matrix_a))] rows_results = pool.map(multiply_row, args_list) for row_result, row_index in rows_results: result[row_index] = row_result return result def benchmark_sequential(size): matrix_a = np.random.rand(size, size) matrix_b = np.random.rand(size, size) start_time = time.time() multiply_matrices(matrix_a, matrix_b) end_time = time.time() return end_time - start_time def benchmark_parallel(size, num_threads): matrix_a = np.random.rand(size, size) matrix_b = np.random.rand(size, size) start_time = time.time() multiply_matrices_parallel(matrix_a, matrix_b, num_threads) end_time = time.time() return end_time - start_time if __name__ == "__main__": sizes = [100, 300, 500] threads = [2, 16, 32] for size in sizes: sequential_time = benchmark_sequential(size) print(f"Время обычное: {sequential_time} с") print(f"Размер матрицы: {size}x{size}") for thread in threads: for size in sizes: parallel_time = benchmark_parallel(size, thread) print(f"Размер матрицы: {size}x{size}") print(f"Время параллельное: {parallel_time} с") print(f"Потоков: {thread}")