2012-07-05 4 views
28

Estoy tratando de aprender a usar el paquete de multiprocesamiento de Python, pero no entiendo la diferencia entre map y imap.Multiproceso de Python: ¿Cuál es la diferencia entre map e imap?

¿La diferencia es que map devuelve, por ejemplo, una matriz o conjunto real, mientras que imap devuelve un iterador sobre una matriz o conjunto? ¿Cuándo usaría uno sobre el otro?

Además, no entiendo qué es el argumento de chunksize. ¿Es este el número de valores que se pasan a cada proceso?

+1

Muy relacionado: [multiprocesamiento.pool: ¿Cuál es la diferencia entre map_async y imap?] (Http://stackoverflow.com/questions/26520781/multiprocessing-pool-whats-the-difference-between-map-async-and -imap/26521507 # 26521507) – dano

Respuesta

25

Esa es la diferencia. Una razón por la que puede usar imap en lugar de mapa es si desea comenzar a procesar los primeros resultados sin esperar a que se calcule el resto. el mapa espera por cada resultado antes de regresar.

En cuanto a Chunksize, a veces es más eficiente repartir el trabajo en grandes cantidades porque cada vez que el trabajador solicita más trabajo, hay un IPC y una sobrecarga de sincronización.

+0

Entonces, ¿cómo se aproxima a determinar un valor razonable para Chunksize? Si más grande significa menos sobrecarga de IPC y sincronización debido al decapado, ¿cuál es la compensación? (es decir, ¿por qué elegir 'chunksize == len (iterable)' es una mala idea, o es?) –

+0

@ Adam Si selecciona 'chunksize = len (iterable)', ¡todas las tareas se asignarán a un único proceso! 'len (iterable) // numprocesses' es el máximo que es útil. El compromiso es entre la sobrecarga de sincronización y la utilización de la CPU (los grandes tamaños de trozos harán que algunos procesos terminen antes que otros, desperdiciando el tiempo de procesamiento potencial). – Antimony

+0

Ok, veo eso, ¿pero eso simplemente significa elegir un fragmento razonable se reduce a prueba y error en datos particulares en una configuración particular? –

0

IMAP es de módulo itertools que se utiliza para una rápida y memoria eficiencia en python.Map se devolver la lista donde como IMAP devuelve el objeto que genera los valores de cada iteraciones (en Python 2.7) .La debajo los bloques de código borrarán la diferencia.

Mapa devuelve la lista se puede imprimir directamente

from itertools import * 
    from math import * 

    integers = [1,2,3,4,5] 
    sqr_ints = map(sqrt, integers) 
    print (sqr_ints) 

rendimientos IMAP objeto que se convierte a la lista y se imprime.

from itertools import * 
from math import * 

integers = [1,2,3,4,5] 
sqr_ints = imap(sqrt, integers) 
print list(sqr_ints) 

chunkSize hará la iterable se divida en trozos de tamaño especificado (aproximados) y cada pieza se somete como una tarea independiente.

Cuestiones relacionadas