65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
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()
|