Si nos dicen programación paralela seguro que lo primero en que pensamos es MPI o openMP, incluso en CUDA.
Pero en algunos casos lo único que necesitamos es aplicar, de manera simple, una operación sobre muchos elementos, y aprovechar el procesador multicore del que disponemos.
El python, al usar map
aplicamos una misma función a cada elemento de una lista. Lo que ofrece el paquete multiprocessing
, entre otras cosas, es poder dividir esta tarea entre el número de procesadores que se especifique.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import multiprocessing
from datetime import datetime
def f(x):
n = int(1e2)
for i in range(n):
for i in range(n):
# computo
i
return i*i
def main():
n = int(1e5)
np = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=np)
l = range(n)
t0 = datetime.now()
map(f,l)
print datetime.now() - t0
t0 = datetime.now()
pool.map(f,l)
print datetime.now() - t0
if __name__ == "__main__":
main()
En un core demoró 50 segundos, versus los 12 al usar cuatro cores.
0:00:50.793201
0:00:12.689651
Los tiempos fueron medidos en un Intel(R) Xeon(R) E5504 2.00GHz.