klyushenkova_ksenia_lab_6 is ready

This commit is contained in:
Pineapple 2024-12-20 22:02:59 +04:00
parent 5dd9e26f07
commit bbbe680013
3 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,17 @@
# Клюшенкова Ксения ПИбд-42
# Лабораторная работа №6 - Определение детерминанта матрицы
## Результат:
![results](./res.jpg)
## Выводы:
1. Применение многопоточности позволяет ускорить вычисление определителя для матриц большого размера.
2. В ходе эксперимента было установлено, что для матрицы размером 10 на 10 при использовании одного потока время выполнения составляет 31 секунду. Однако при использовании 10 потоков время выполнения сокращается до 5 секунд.
3. Однако при работе с матрицами небольшого размера использование многопоточности может привести к снижению производительности.
4. Для матрицы размером 8 на 8 использование 10 потоков оказывается менее эффективным, чем использование 4 или 8 потоков. Это связано с дополнительными затратами на создание и управление потоками, которые становятся значительными при небольших объёмах вычислений.
5. Использование многопоточности позволяет значительно сократить время выполнения для матриц большого размера. Однако для достижения наилучших результатов необходимо выбрать оптимальное количество потоков в зависимости от размера задачи, чтобы избежать дополнительных затрат.
## [Видео](https://drive.google.com/file/d/1bdc3WzkHtTI3p-Yk2w3OP3ldMP8WwjZ8/view?usp=sharing)

View File

@ -0,0 +1,64 @@
import numpy as np
from time import time
import multiprocessing
def task(matrix, start_j, stop_j, queue):
size = len(matrix[0])
if size == 2: # Базовый случай: определитель 2x2
det = matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]
if queue is not None:
queue.put(det)
return det
else:
res = 0
for j in range(start_j, stop_j):
# Удаляем строку и столбец с помощью срезов (более эффективно)
tmp = matrix[1:, :j]
tmp = np.hstack((tmp, matrix[1:, j + 1:]))
a = matrix[0][j]
b = task(tmp, 0, len(tmp[0]), None)
if j % 2 == 0:
res += a * b
else:
res += a * b * (-1)
if queue is not None:
queue.put(res)
return res
if __name__ == '__main__':
sizes = [5, 6, 7, 8, 9, 10]
threads_counts = [1, 4, 6, 8, 10]
for threads in threads_counts:
print(f'Количество потоков: {threads}')
for size in sizes:
matrix = np.random.randint(10, size=(size, size))
offset = int(size / threads)
offset_last = size % threads + offset
processes = []
queue = multiprocessing.Queue()
start = time()
for i in range(threads):
start_ = i * offset
stop_ = start_ + offset_last if i == threads - 1 else start_ + offset
process = multiprocessing.Process(target=task, args=(matrix, start_, stop_, queue))
processes.append(process)
process.start()
total_result = 0
for p in processes:
p.join()
total_result += queue.get()
stop = time()
print(f'Размер: {size}x{size}, время выполнения: {stop - start} сек')
print()

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB