import numpy as np import time from concurrent.futures import ThreadPoolExecutor def sequential_matrix_determinant(matrix): """Выполняет последовательное вычисление детерминанта матрицы.""" return np.linalg.det(matrix) def parallel_matrix_determinant(matrix, num_threads=1): """ Выполняет параллельное вычисление детерминанта матрицы с использованием заданного количества потоков. Каждый поток обрабатывает свою часть вычислений. """ rows, cols = matrix.shape chunk_size = rows // num_threads determinants = [] def calculate_determinant(start_row, end_row): """Вычисление детерминанта для части матрицы.""" nonlocal determinants submatrix = matrix[start_row:end_row, :] # Убедимся, что submatrix является квадратной submatrix_size = min(submatrix.shape) determinant = np.linalg.det(submatrix[:submatrix_size, :submatrix_size]) determinants.append(determinant) with ThreadPoolExecutor(max_workers=num_threads) as executor: futures = [] for i in range(0, rows, chunk_size): end_row = min(i + chunk_size, rows) futures.append(executor.submit(calculate_determinant, i, end_row)) for future in futures: future.result() return determinants def benchmark(matrix_size, num_threads=1): """ Измеряет время выполнения последовательного и параллельного вычисления детерминанта матриц заданного размера с использованием заданного количества потоков. """ matrix = np.random.randint(0, 10, size=(matrix_size, matrix_size)) # Замер времени для последовательного алгоритма start_time = time.time() sequential_result = sequential_matrix_determinant(matrix) sequential_time = time.time() - start_time # Замер времени для параллельного алгоритма start_time = time.time() parallel_result = parallel_matrix_determinant(matrix, num_threads) parallel_time = time.time() - start_time return sequential_time, parallel_time if __name__ == "__main__": matrix_sizes = [100, 300, 500] # Для демонстрации используем небольшие матрицы num_threads = int(input("Введите количество потоков: ")) for size in matrix_sizes: print(f"Matrix size: {size}x{size}") sequential_time, parallel_time = benchmark(size, num_threads) print(f"Sequential algorithm time: {sequential_time:.6f} seconds") print(f"Parallel algorithm time ({num_threads} threads): {parallel_time:.6f} seconds") print("="*30)