DAS_2023_1/arutunyan_dmitry_lab_6/main.py

77 lines
2.6 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 time
import numpy as np
import concurrent.futures
import psutil
def calculate_determinant(args):
matrix, i = args
multiplier = matrix[0][i]
if i % 2 != 0:
multiplier *= -1
matrix = np.delete(matrix, 0, axis=0)
submatrix = np.delete(matrix, i, axis=1)
return np.linalg.det(submatrix) * multiplier
def parallel_determinant(matrix, parallel):
memory = psutil.virtual_memory()
n = matrix.shape[0]
if parallel:
with concurrent.futures.ThreadPoolExecutor(max_workers=n) as executor:
results = []
start_time = time.time()
for i in range(n):
results.append(executor.submit(calculate_determinant, args=(matrix, i)))
result = np.sum([res.result() for res in results])
end_time = time.time()
else:
start_time = time.time()
result = np.linalg.det(matrix)
end_time = time.time()
execution_time = end_time - start_time
return result, execution_time, psutil.cpu_percent(interval=1), memory.percent
def test(parallel):
mx = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = parallel_determinant(mx, parallel)
print(f"Определитель матрицы: {result[0]}")
print(f"Время выполнения: {result[1]} сек.")
print(f"Загрузка ЦП: {result[2]} %")
print(f"Использование ОЗУ: {result[3]} %")
def bench50x50(parallel):
mx = np.random.randint(0, 100, size=(50, 50))
result = parallel_determinant(mx, parallel)
print(f"Определитель матрицы: {result[0]}")
print(f"Время выполнения: {result[1]} сек.")
print(f"Загрузка ЦП: {result[2]} %")
print(f"Использование ОЗУ: {result[3]} %")
def bench75x75(parallel):
mx = np.random.randint(0, 100, size=(75, 75))
result = parallel_determinant(mx, parallel)
print(f"Определитель матрицы: {result[0]}")
print(f"Время выполнения: {result[1]} сек.")
print(f"Загрузка ЦП: {result[2]} %")
print(f"Использование ОЗУ: {result[3]} %")
def bench125x125(parallel):
mx = np.random.randint(0, 100, size=(125, 125))
result = parallel_determinant(mx, parallel)
print(f"Определитель матрицы: {result[0]}")
print(f"Время выполнения: {result[1]} сек.")
print(f"Загрузка ЦП: {result[2]} %")
print(f"Использование ОЗУ: {result[3]} %")
if __name__ == '__main__':
# test(parallel=False)
# bench50x50(parallel=False)
# bench75x75(parallel=False)
bench125x125(parallel=False)