60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
import random
|
||
import time
|
||
import multiprocessing
|
||
import numpy as np
|
||
|
||
def create_random_matrix(size):
|
||
return [[random.randint(0, 10) for _ in range(size)] for _ in range(size)]
|
||
|
||
# Функция для умножения одной строки матрицы
|
||
def process_row(i, A, B, result):
|
||
size = len(A)
|
||
for j in range(size):
|
||
for k in range(size):
|
||
result[i][j] += A[i][k] * B[k][j]
|
||
|
||
|
||
# Функция для параллельного умножения матриц с использованием multiprocessing
|
||
def multiply_matrices_in_parallel(A, B, num_processes):
|
||
size = len(A)
|
||
result = [[0] * size for _ in range(size)]
|
||
|
||
with multiprocessing.Pool(processes=num_processes) as pool:
|
||
pool.starmap(process_row, [(i, A, B, result) for i in range(size)])
|
||
|
||
return result
|
||
|
||
|
||
# Функция для измерения времени выполнения умножения матриц
|
||
def measure_execution_time(size, num_processes=1):
|
||
A = create_random_matrix(size)
|
||
B = create_random_matrix(size)
|
||
|
||
start_time = time.time()
|
||
multiply_matrices_in_parallel(A, B, num_processes)
|
||
elapsed_time = time.time() - start_time
|
||
|
||
return elapsed_time
|
||
|
||
def main():
|
||
matrix_sizes = [100, 300, 500]
|
||
process_count_options = [1, 2, 4, 6, 8]
|
||
|
||
print("-*" * 40)
|
||
print(f"{'Количество потоков':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}")
|
||
print("-*" * 40)
|
||
|
||
# Запуск тестов для разных значений числа процессов
|
||
for num_processes in process_count_options:
|
||
row = f"{num_processes:<20}"
|
||
|
||
for size in matrix_sizes:
|
||
par_time = measure_execution_time(size, num_processes)
|
||
row += f"|{par_time:.4f}".ljust(20)
|
||
print(row)
|
||
print("-*" * 40)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|