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.

Optimizar el código para mejorar el rendimiento y reducir el tiempo de ejecución.

Tengo un código perfectamente funcional. Sin embargo, cuando ejecuto un archivo CSV grande (alrededor de 2GB), tarda aproximadamente de 15 a 20 minutos para completar la ejecución del código. ¿Existe alguna forma de optimizar el código a continuación para que tome menos tiempo en finalizar la ejecución y, por lo tanto, mejorar el rendimiento?

from csv import reader, writer
import pandas as pd

path = (r"data.csv")

data = pd.read_csv(path, header=None)

last_column = data.iloc[:, -1]

arr = [i+1 for i in range(len(last_column)-1) if (last_column[i] == 1 and last_column[i+1] == 0)]

ch_0_6 = []
ch_7_14 = []
ch_16_22 = []

with open(path, 'r') as read_obj:
    csv_reader = reader(read_obj)
    rows = list(csv_reader)

for j in arr:

    # Canal 1-7
    ch_0_6_init = [int(rows[j][k]) for k in range(1,8)]
    bin_num = ''.join([str(x) for x in ch_0_6_init])
    dec_num = int(f'{bin_num}', 2)
    ch_0_6.append(dec_num)
    ch_0_6_init = []

    # Canal 8-15
    ch_7_14_init = [int(rows[j][k]) for k in range(8,16)]
    bin_num = ''.join([str(x) for x in ch_7_14_init])
    dec_num = int(f'{bin_num}', 2)
    ch_7_14.append(dec_num)
    ch_7_14_init = []

    # Canal 16-22
    ch_16_22_init = [int(rows[j][k]) for k in range(16,23)]
    bin_num = ''.join([str(x) for x in ch_16_22_init])
    dec_num = int(f'{bin_num}', 2)
    ch_16_22.append(dec_num)
    ch_16_22_init = []

Datos de muestra:

0.0114,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1
0.0112,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0
0.0115,0,1,0,1,1,1,0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,0,1
0.0117,0,1,0,1,1,1,0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0
0.0118,0,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,0,1

Unir los dígitos binarios para formar un número decimal dependiendo de los canales seleccionados.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay varias formas de optimizar un código que trabaja con un archivo CSV grande, dependiendo del caso de uso específico. Aquí hay algunas sugerencias para mejorar el rendimiento del código dado:

    1. Utilice la biblioteca pandas para leer el archivo CSV: el código actual primero lee el archivo utilizando el módulo csv y luego lo convierte en un DataFrame de pandas. Este proceso se puede simplificar leyendo directamente el archivo utilizando pandas. Por ejemplo, en lugar de:
      with open(path, 'r') as read_obj:
          csv_reader = reader(read_obj)
          rows = list(csv_reader)
      data = pd.DataFrame(rows)
      

      Puede simplemente usar:

      data = pd.read_csv(path, header=None)
      
    2. Evite crear listas innecesarias: en el código dado, se crean varias listas temporales para extraer valores de cada fila del archivo CSV. Esto se puede evitar accediendo directamente a los valores del DataFrame utilizando el método iloc de pandas. Por ejemplo, en lugar de:
      ch_0_6_init = [int(rows[j][k]) for k in range(1,8)]
      

      Puede usar:

      ch_0_6_init = data.iloc[j, 1:8].tolist()
      
    3. Utilice operaciones vectorizadas para un cálculo más rápido: pandas proporciona varias operaciones vectorizadas que se pueden aplicar a todas las filas de un DataFrame simultáneamente, lo que puede mejorar significativamente el rendimiento en comparación con iterar a través de cada fila. Por ejemplo, en lugar de usar un bucle y concatenación para crear cadenas binarias y luego convertirlas en números decimales, puede utilizar el método apply con una función lambda para aplicar el mismo cálculo a todas las filas:
      dec_num = data.apply(lambda x: int(''.join(map(str, x[start:end+1])), 2), axis=1)
      

      Donde start y end son los índices de inicio y fin de los dígitos binarios para cada canal.

    Al aplicar estas optimizaciones, el código se puede volver más eficiente y con mejor rendimiento al trabajar con archivos CSV grandes.

Comments are closed.