Tengo una pregunta sobre cómo encontrar el mínimo en una lista en mi camino:

Tengo una lista grande donde cada registro es así:

['22:00:19', '0026f88e557225333f01', '23', '37', '', '176.2', '0', '60', 'SOMETHING', 
 3.318717958567554e-05]

Pero el primer y último registro de la lista no contienen el último número:

Por ejemplo:

['22:00:09', '0026f88e557225333f01', '23', '37', '', '176', '0', '60', 'SOMETHING']

Necesito encontrar el mínimo de esa última columna 3.318717958567554e-05 y su índice en cada llamada de mi función.

Aquí está mi código:

def find_min(data, size, num):

    for index, i in enumerate(data):

        if index == 0 or index == data.__len__() -1: continue

        if index == 1:
            minimum = float(i[9])
            idx = index
            continue

        if float(i[9]) < minimum or float(i[9]) < num:
            minimum = float(i[9])
            idx = index

    return idx, minimum

num es un umbral definido por el usuario que se utiliza para calcular mín. (Mín debe ser menor que eso). Este código funciona correctamente y encuentro lo que quiero, pero cómo puedo hacer que mi código sea más rápido porque llamo a esta función miles de veces y trabajo con un conjunto de datos enorme y, como resultado, el tiempo de ejecución se debe en gran medida a esa función lenta.

0
Panagiotis Alimisis 26 ago. 2020 a las 22:01

1 respuesta

La mejor respuesta

Deshazte de todas las declaraciones if y divide la matriz solo en las que te interesan.

Convierta i[9] a flotar solo una vez.

def find_min(data, size, num):
    idx = 1
    minimum = float(data[1][9])
    for index, i in enumerate(data[2:-1]):        
        f = float(i[9])
        if f < minimum or f < num:
            minimum = f
            idx = index + 2 # +2 because of the slicing
    
    return idx, minimum

O si la lista es tan grande que hacer una porción de ella es demasiado costoso, simplemente repita los índices:

def find_min(data, size, num):
    idx = 1
    minimum = float(data[1][9])
    for index in range(2, len(data)-1):     
        f = float(data[index][9])
        if f < minimum or f < num:
            minimum = f
            idx = index
    
    return idx, minimum
1
Barmar 26 ago. 2020 a las 19:21