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.

La forma más rápida de realizar operaciones en un arreglo de numpy miles de millones de veces.

Mi código tiene los siguientes objetivos:

1.) Dadas dos matrices numpy a1 y a2 (compuestas solo de 0 y 1), encontrar las ubicaciones de los índices de los 0 en a1 y a2.

2.) Encontrar las posiciones de índice coincidentes, si las hay, entre la matriz a1 y a2.

3.) Calcular una métrica.

Forma de la matriz a1 = 2161.

Forma de la matriz a2 = 2161.

ejemplo:

a1 = [0,1,1,0,1,0,1]

a2 = [1,1,0,0,1,1,0]

índices de los 0 en a1 = idx_a1[0,3,5]

índices de los 0 en a2 = idx_a2[2,3,6]

índices de 0 comunes entre a1 y a2 = 3

La función_1 realiza los pasos 1, 2 y 3.

La función_1_repeticiones repite la función_1 después de mezclar aleatoriamente a1 y repetir el cálculo de la métrica 1000 veces. Esto se hace con el propósito de determinar si la métrica es estadísticamente significativa.

Ejecuto el siguiente código en 100 millones de pares de matrices, multiplicado en 256 núcleos. El mejor tiempo de ejecución para 100 millones de pares de matrices es de aproximadamente 40 minutos. ¿Existe alguna forma de hacerlo significativamente más eficiente? Necesito ejecutar esto en miles de millones de pares de matrices.

El siguiente código es el más rápido que pude elaborar con cierta ayuda de personas de “codereview” anteriormente:

def función_1(self, a1, a2):

        indice_evento1, = np.where(a1 == 0)
        indice_evento2, = np.where(a2 == 0)
        n1, = indice_evento1.shape
        n2, = indice_evento2.shape

        if n1 == 0 or n2 == 0:
            return 0, 0

        n_coincidencias, = np.intersect1d(indice_evento1, indice_evento2, assume_unique=True).shape

        c_ij = n_coincidencias/2

        métrica_1 = (c_ij * 2) / math.sqrt(n1 * n2)

        return métrica_1

    def función1_repeticiones(self, a1, a2, repetir = 1000, métrica_original):

        lista_métrica = []
        a1_copia = copy.deepcopy(a1)

        for i in range(0, repetir):
            np.random.shuffle(a1_copia)    # mezclar bits en la matriz y recalcular 1000 veces

            métrica_1 = self.función_1(a1=a1_copia, a2=a2)
            lista_métrica.append(métrica_1)
        lista_métrica = np.array(lista_métrica)

        valor_significativo = len(np.where(lista_métrica >= [métrica_original])[0])/repetir

        return valor_significativo 
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, puedo ofrecer varias sugerencias para optimizar el código proporcionado:

    1. Considera utilizar procesamiento paralelo más allá de la multiprocesamiento en 256 núcleos para distribuir aún más la carga de trabajo. Por ejemplo, puedes explorar la distribución del procesamiento en varios servidores.
    2. Utiliza Cython o compiladores JIT (just-in-time) para optimizar aún más el rendimiento del código de Python.
    3. Intenta optimizar el algoritmo para reducir cálculos o bucles innecesarios. Por ejemplo, puedes intentar minimizar los cálculos necesarios para identificar las ubicaciones de índice de los 0 en los arreglos dados.
    4. Explora el uso de una estructura de datos más eficiente para almacenar los arreglos, lo cual puede reducir el uso de memoria y el tiempo de computación.

    Al implementar estas sugerencias, puedes optimizar el código actual y lograr un mejor rendimiento, lo cual es esencial al trabajar con miles de millones de pares de arreglos.

Comments are closed.