es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , ,

Answer

  1. Avatar for 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:

    import numpy as np
    from multiprocessing import Pool
    
    num = 10  # número de pruebas
    results = np.zeros([num, 2])  # array de resultados (2 porque la función produce 2 resultados)
    
    def f():
        # función sin argumentos porque el proceso se basa en aleatoriedad
        a = np.random.random()
        b = np.random.random()
        return a, b  # los resultados son de tipo float64
    
    if __name__ == '__main__':
        with Pool(4) as p:
            # usa pool.map para ejecutar la función en paralelo
            data = p.map(f, range(num))
        # actualiza el array de resultados con los valores devueltos
        for i, (a, b) in enumerate(data):
            results[i][0] = a
            results[i][1] = b
        print(results)
    

    Lo que hace este código:

    • Definimos una función f que devuelve dos valores flotantes aleatorios. Esta función no toma argumentos porque los procesos se basan en la aleatoriedad.
    • Creamos un array de numpy vacío results con forma (num, 2), lo que significa que almacenará num conjuntos de dos valores.
    • Dentro del bloque principal, creamos un objeto Pool con 4 procesos. Esto significa que la función map se llamará con hasta 4 argumentos a la vez.
    • Usamos p.map para llamar a la función f num veces en paralelo. El iterable range(num) pasado a map devolverá enteros desde 0 hasta num-1.
    • La función map devuelve una lista de tuplas que contienen los valores devueltos por la función. Recorremos esta lista y actualizamos el array results con los valores devueltos.
    • Finalmente, imprimimos el array 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.

Comments are closed.