import numpy as np import time from concurrent.futures import ThreadPoolExecutor def sequential_matrix_multiply(matrix_a, matrix_b): return np.dot(matrix_a, matrix_b) def parallel_matrix_multiply(matrix_a, matrix_b, num_threads): result = np.zeros_like(matrix_a) rows, cols = matrix_a.shape def multiply_row(row): nonlocal matrix_a, matrix_b, result result[row, :] = np.dot(matrix_a[row, :], matrix_b) with ThreadPoolExecutor(max_workers=num_threads) as executor: executor.map(multiply_row, range(rows)) return result def benchmark(matrix_size, num_threads=1): matrix_a = np.random.rand(matrix_size, matrix_size) matrix_b = np.random.rand(matrix_size, matrix_size) start_time = time.time() sequential_result = sequential_matrix_multiply(matrix_a, matrix_b) sequential_time = time.time() - start_time start_time = time.time() parallel_result = parallel_matrix_multiply(matrix_a, matrix_b, num_threads) parallel_time = time.time() - start_time return sequential_time, parallel_time # Пример использования для матриц размером 100x100, 300x300, 500x500 элементов matrix_sizes = [100, 300, 500] threads_count = 4 # Указать желаемое количество потоков for size in matrix_sizes: sequential_time, parallel_time = benchmark(size, threads_count) print(f"Размер матрицы: {size}x{size}") print(f"Время с последовательным выполнением: {sequential_time:.6f} секунд") print(f"Время с параллельной обработкой ({threads_count} потоков): {parallel_time:.6f} секунд") print("=" * 30)