DAS_2023_1/savenkov_alexander_lab_6/app.py

70 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)