prueba de multiproceso de python: baja velocidad debido a la sobrecarga?

Estoy tratando de aprender sobre multiprocessing en python (2.7). Mi CPU tiene 4 núcleos. En el siguiente código, compruebo la velocidad de la ejecución en serie Vs paralela de la misma instrucción básica.

Me parece que el tiempo que se tarda en usar los 4 núcleos es solo de 0,67 el de un solo núcleo, mientras que ingenuamente esperaría ~ 0,25.

¿Es la sobrecarga la razón? ¿De dónde viene? ¿No son los 4 procesos independientes?

También probé pool.map y pool.map_async , con resultados muy similares en términos de velocidad.

 from multiprocessing import Process import time def my_process(a): for i in range(0,a[1]): j=0 while j<10000: j = j+1 print(a,j) if __name__ == '__main__': # arguments to pass: a = ((0,2000),(1,2000),(2,2000),(3,2000)) # --- 1) parallel processes: # 4 cores go up to 100% each here t0 = time.time() proc1 = Process(target=my_process, args=(a[0],)) proc2 = Process(target=my_process, args=(a[1],)) proc3 = Process(target=my_process, args=(a[2],)) proc4 = Process(target=my_process, args=(a[3],)) proc1.start(); proc2.start(); proc3.start(); proc4.start() proc1.join() ; proc2.join() ; proc3.join() ; proc4.join() dt_parallel = time.time()-t0 print("parallel : " + str(dt_parallel)) # --- 2) serial process : # 1 core only goes up to 100% t0 = time.time() for k in a: my_process(k) dt_serial = time.time()-t0 print("serial : " + str(dt_serial)) print("t_par / t_ser = " + str(dt_parallel/dt_serial)) 

EDITAR mi PC tiene en realidad 2 núcleos físicos (2 = 2 núcleos por socket * 1 sockets, desde lscpu [gracias @goncalopp]). Si ejecuto el script anterior con solo los primeros 2 procesos, obtengo una proporción de 0.62, no muy diferente a la obtenida con 3 o 4 procesos. Supongo que no será fácil ir más rápido que eso.

lscpu en otra PC con lscpu : CPU (s): 32, Hilos por núcleo: 2, Núcleo (s) por socket: 8, Socket (s): 2, y obtengo una proporción de 0.34, similar a @dano.

Gracias por tu ayuda

Sí, esto puede estar relacionado con los gastos generales, incluyendo:

  • Creando e iniciando los procesos.
  • Pasando la función y los argumentos a ellos.
  • esperando la terminación del proceso

Si realmente tiene 4 núcleos físicos en su máquina (y no 2 núcleos con hyperthreading o similar), debería ver que la proporción se acerque más a lo que se espera para las entradas más grandes, como dijo Chepner. Si solo tienes 2 núcleos físicos, no puedes obtener una proporción <0.5