70 lines
3.0 KiB
Python
70 lines
3.0 KiB
Python
|
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)
|