DAS_2023_1/arutunyan_dmitry_lab_6/main.py

77 lines
2.6 KiB
Python
Raw Normal View History

2024-01-17 22:32:28 +04:00
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)