dummy - python pool apply_async
Multiprocesamiento de Python: ¿Cuál es la diferencia entre mapa e imap? (3)
Estoy tratando de aprender a usar el paquete de multiprocesamiento de Python, pero no entiendo la diferencia entre map
e imap
.
¿Es la diferencia que el map
devuelve, digamos, 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 del tamaño. ¿Es este el número de valores que se pasan a cada proceso?
Con imap, las llamadas bifurcadas se realizan en paralelo, no una tras otra de forma secuencial. Por ejemplo, a continuación, está pulsando, por ejemplo, tres intercambios para obtener libros de pedidos. En lugar de golpear el intercambio 1, luego el intercambio 2, luego el intercambio 3 secuencialmente, las llamadas imap.pool no se bloquean y van directamente a los tres intercambios para buscar libros de pedidos tan pronto como llame.
from pathos.multiprocessing import ProcessingPool as Pool
pool = Pool().imap
self.pool(self.getOrderBook, Exchanges, Tickers)
Esa es la diferencia. Una de las razones por las que podría usar imap en lugar del mapa es si desea comenzar a procesar los primeros resultados sin esperar a que se calcule el resto. El mapa espera 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 sobrecarga de IPC y sincronización.
imap es un módulo de itertools que se usa para rapidez y eficiencia de memoria en python. El mapa devolverá la lista, mientras que imap devuelve el objeto que genera los valores para cada iteración (en python 2.7). Los bloques de código siguientes 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)
imap devuelve el 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á que el iterable se divida en partes de un tamaño específico (aproximado) y cada pieza se envíe como una tarea separada.