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