Cómo llamar a una función n veces utilizando multiprocessing.
Quiero llamar a mi función n veces con multiprocessing (para ahorrar tiempo) y guardar los resultados en un array numpy:
num = N # número de pruebas
results = np.zeros([N,2]) # array de resultados (2 porque la función produce 2 resultados)
def f(): # función sin argumentos porque el proceso se basa en la aleatoriedad
....
return a, b # los resultados son de tipo float64
Quiero algo como esto:
for i in range(num):
results[i] = f()
pero usando multiprocessing. ¿Existe alguna manera?
Intenté esto pero no funciona:
from multiprocessing import Pool
if __name__ == '__main__':
with Pool(15) as p:
for i in range(num):
result[i] = p.map(f, iterable=i)
davy.ai
Sí, puedes usar multiprocessing para llamar a una función múltiples veces y guardar los resultados en un array de numpy. Aquí hay una forma de hacerlo:
Lo que hace este código:
f
que devuelve dos valores flotantes aleatorios. Esta función no toma argumentos porque los procesos se basan en la aleatoriedad.results
con forma(num, 2)
, lo que significa que almacenaránum
conjuntos de dos valores.Pool
con 4 procesos. Esto significa que la funciónmap
se llamará con hasta 4 argumentos a la vez.p.map
para llamar a la funciónf
num
veces en paralelo. El iterablerange(num)
pasado amap
devolverá enteros desde 0 hastanum-1
.map
devuelve una lista de tuplas que contienen los valores devueltos por la función. Recorremos esta lista y actualizamos el arrayresults
con los valores devueltos.results
para verificar que los valores se hayan almacenado correctamente.Ten en cuenta que debemos usar el bloque
if __name__ == '__main__':
al utilizar multiprocessing. Esto es necesario para evitar una recursión infinita al ejecutar en Windows.Además, ten en cuenta que el número de procesos en el pool no debe exceder el número de núcleos de CPU disponibles, ya que esto podría ralentizar el código. Aquí elegimos 4 procesos porque es un valor razonable para una CPU típica de cuatro núcleos. Puedes ajustar este valor según la configuración de tu hardware específico.