diff --git a/tsukanova_irina_lab_6/opred.py b/tsukanova_irina_lab_6/opred.py new file mode 100644 index 0000000..0c4a893 --- /dev/null +++ b/tsukanova_irina_lab_6/opred.py @@ -0,0 +1,72 @@ +import numpy as np +from time import time +import multiprocessing + + +def do_task(matrix, start_j, stop_j, queue): + size = len(matrix[0] - 1) + if size == 2: + return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1] + else: + res = 0 + for j in range(start_j, stop_j): + tmp = np.delete(matrix, 0, axis=0) + tmp = np.delete(tmp, j, axis=1) + a = matrix[0][j] + b = do_task(tmp, 0, len(tmp[0]), None) + + if j % 2 == 0: + res += a * b + else: + res += a * b * (-1) + # print(res) + if queue: + queue.put(res) + return res + + +def do_threads(matrix, size, threads): + offset = int(size / threads) + offset_last = size % threads + offset + + processes = [] + queue = multiprocessing.Queue() + start_test = time() + for i in range(threads): + start_ = i * offset + stop_ = start_ + offset_last if i == threads - 1 else start_ + offset + + process = multiprocessing.Process(target=do_task, args=(matrix, start_, stop_, queue)) + processes.append(process) + process.start() + + total_result = 0 + for p in processes: + p.join() + total_result += queue.get() + + # print(total_result) + stop_test = time() + print(f'{size}x{size}, time: {stop_test - start_test}') + + +matrix2 = np.array([ + [3, -3, -5, 8], + [-3, 2, 4, -6], + [2, -5, -7, 6], + [-4, 3, 5, -6] +]) + +if __name__ == '__main__': + sizes = [5, 6, 7, 8, 9, 10, 11, 12] + threads_counts = [1, 4, 6, 8, 12] + + for threads in threads_counts: + print('-------------------------------------------------') + print(f'Threads:{threads}') + for n in sizes: + m = np.random.randint(3, size=(n, n)) + do_threads(m, n, threads) + + print('-------------------------------------------------') +