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.
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:
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:Puede simplemente usar:
iloc
de pandas. Por ejemplo, en lugar de:Puede usar:
apply
con una función lambda para aplicar el mismo cálculo a todas las filas:Donde
start
yend
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.