klyushenkova_ksenia_lab_6 is ready
This commit is contained in:
parent
5dd9e26f07
commit
bbbe680013
17
klyushenkova_ksenia_lab_6/REDME.md
Normal file
17
klyushenkova_ksenia_lab_6/REDME.md
Normal 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)
|
64
klyushenkova_ksenia_lab_6/main-1.py
Normal file
64
klyushenkova_ksenia_lab_6/main-1.py
Normal 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()
|
BIN
klyushenkova_ksenia_lab_6/res.jpg
Normal file
BIN
klyushenkova_ksenia_lab_6/res.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 206 KiB |
Loading…
Reference in New Issue
Block a user