Advertisement
MiguelazoDS

Untitled

Sep 14th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.20 KB | None | 0 0
  1. def mergesort_paralelo(data):
  2.     #Crea un pool de procesos, uno por cada core.
  3.     procesos = multiprocessing.cpu_count()
  4.     pool = multiprocessing.Pool(processes=procesos)
  5.     #Particionamos los datos iniciales de igual tamaño y se hace un merge sort
  6.     #Para cada partición.
  7.     size = int(math.ceil(float(len(data)) / procesos))
  8.     data = [data[i * size:(i + 1) * size] for i in range(procesos)]
  9.     #Ordena cada partición por separado en cada uno de los cores.
  10.     data = pool.map(mergesort, data)
  11.     #Las 3 líneas siguientes realizan el merge sin el uso del paralelismo.
  12.     #list1 = merge(data[0], data[1])
  13.     #list2 = merge(data[2], data[3])
  14.     #list = merge(list1, list2)
  15.     #Hacemos un merge de a pares hasta que nos quedamos con solo una
  16.     #partición. starmap permite utilizar múltiples argumentos.
  17.     while len(data) > 1:
  18.         #Si el número de particiones es impar, la quitamos y la agregamos al final
  19.         #Ya que estamos haciendo un merge de a pares.
  20.         extra = data.pop() if len(data) % 2 == 1 else None
  21.         data = [(data[i], data[i + 1]) for i in range(0, len(data), 2)]
  22.         data = pool.starmap(merge, data) + ([extra] if extra else [])
  23.     return data[0]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement