Código de chat gpt muy lento con grandes volúmenes de archivos
Usuario anónimo -
Hola a todos,
Estoy en un gran proyecto y les confieso que es chat gpt quien me creó mis scripts de python.
Me gustaría saber si conocen un sitio o personas que entiendan el código python de Chat gpt.
El chat GPT me creó mucho código python (todo lo que necesito) pero el problema es que no es rápido en absoluto, es muy, muy lento con cientos de carpetas que contienen alrededor de 100,000 archivos csv...
¿Conocen algo o alguien que pueda ayudarme, por favor?
Se los agradezco de antemano ????
7 respuestas
-
Las IA no son tan inteligentes como se piensa. He hecho pruebas con Google Gemini. Algunos resultados fueron extraordinarios y otros horribles.
Depende de lo que tengan en su base de datos.
Los códigos Python de ChatGPT no son más difíciles (ni más fáciles) de entender que los códigos Python generados por un humano.
¿Y qué tipo de rendimiento esperas con "cientos" de archivos que contienen más de 100,000 elementos?
Como dijo @mariam-j, te haría falta un lenguaje compilado como C, C++ o Rust (siempre y cuando los conozcas).
Y eso depende de la complejidad del método utilizado. Quizás un curso de algoritmos podría ayudar. -
Gracias por esta información, PierrotLeFou, voy a informarme sobre qué son C, C++ y Rust, porque ya he oído hablar de ellos. Mi disco duro externo donde se encuentran todos los archivos es un HDD, así que aún más lento.
Pero el código que me propone el chat GPT me genera 100,000 archivos en 9 horas. Podría haber aceptado en 3 o 4 horas, pero 9 horas es demasiado.
De todos modos, gracias, voy a informarme.
-
No he analizado tu código, pero tengo dudas sobre la pertinencia del threading.
Todos tus archivos están en el mismo HDD y, hasta donde sé, solo hay un acceso al disco.
He trabajado en un sistema multiusuario donde el sistema gestionaba de forma especial los accesos al disco.
Sabía dónde se encontraban las cabezas de lectura y trataba de satisfacer la solicitud más cercana a la posición actual.
Había un sistema de prioridad que impedía que una solicitud quedara atrapada en la cola.
Pero en tu caso, en los nuevos sistemas, ya no se hace eso.
Podemos suponer (...) que los sectores asociados a un archivo dado están bastante cerca unos de otros.
Así que me pregunto si un tratamiento secuencial (un archivo tras otro) no sería más rápido.
No sabiendo exactamente qué significa "cientos" de archivos, he supuesto que hay 500.
He supuesto que hay bien 100000 entradas en cada archivo.
Y 9 horas dan 32400 segundos.
Llego a la conclusión de que se necesitan 648 microsegundos por entrada. Incluso en Python se puede hacer mejor.-
¿Qué le puedo pedir al chat IA para que pueda mejorar mi código en Python? Porque 100,000 archivos me los procesa en 38,521 segundos. Casi 11 horas, así que estoy deprimido. No sé qué hacer. Ahora le estoy pidiendo al chat GPT que me cree el mismo código pero en Rust, y desde esta mañana, es decir, desde las 10, he estado con él, me ha hecho intentar al menos 20 códigos y todos tienen errores. Ni un solo código correcto desde esta mañana...
-
He notado que las IA, especialmente Google Gemini para mí, son bastante malas con Rust.
Como dije, las IA no son realmente inteligentes.
Ellas buscan en su base de datos para encontrar código que coincida con la solicitud.
Como Rust es relativamente nuevo, probablemente haya poco código en este lenguaje.
Supongo que no conoces muy bien la programación.
En principio, se te sugeriría que escribas tú mismo tu código.
Puedes pedirle que no use threading por la razón que mencioné.
Las IA hacen un buen análisis semántico.
Puedes intentar explicar con tus propias palabras tu configuración. Por ejemplo, que todos tus archivos están en el mismo HDD y que no tienes acceso múltiple en paralelo.
¿No hay realmente ningún código en Rust que funcione?
¿Has intentado en C o C++? (creo que tendrías más suerte en C++). -
-
-
-
-
Hola,
Para tratar tu problema de manera efectiva (ver #6), deberías olvidar C/C++/Rust que no te aportarán gran cosa y en su lugar interesarte más por pandas.
Luego, creo que no aprenderás nada con ChatGPT y que no es el enfoque adecuado. ChatGPT debe verse como un motor de búsqueda mejorado. Según mi experiencia, ChatGPT responde correctamente en problemas simples (entender: cosas que podrías haber encontrado con una búsqueda en Google o en StackOverflow) pero no en problemas más avanzados. Cuántas veces he visto a ChatGPT contarme tonterías. Y lo más gracioso es que cuando le señalas el error, ChatGPT hace su mea culpa. Rápidamente se queda dando vueltas y no te permite avanzar.
Como dice Pierrot, una IA no es INTELIGENTE (y sé de lo que hablo, trabajo en IA). Los especialistas te dirían que no es más que un loro estocástico, lo que en lenguaje cotidiano significa que solo emite una "media" de todo lo que ha visto en función de lo que le pides y del contexto actual.
Mi consejo si quieres progresar y sobre todo tener éxito sería:
- infórmate sobre los buenos enfoques para resolver un problema, posiblemente con la ayuda de ChatGPT,
- aprende a utilizar las soluciones técnicas que parezcan pertinentes: hay muchas documentaciones y tutoriales en Internet, y en todos los formatos,
- sé crítico con lo que lees (especialmente cuando se trata de algo generado por una IA)
- En tu caso, ChatGPT te orienta hacia Python. ¿Por qué? Es efectivamente el lenguaje comúnmente utilizado por los científicos de datos para volúmenes de datos no demasiado astronómicos (que es tu caso).
- Luego, ChatGPT te orienta hacia Polars. ¿Por qué? Para acelerar la carga de los CSV.
- En general, "se" utiliza pandas (y por lo tanto, se pueden encontrar muchos recursos en Internet que muestran cómo usarlo).
- No he utilizado polars, así que no tengo una opinión, puede que esté bien, pero si tuviera que hacerlo, comenzaría por verificar que polars ofrece todas las primitivas que necesito.
- Según este enlace, polars parece ser más eficiente que pandas. Dicho esto, no es el más rápido, así que ¿por qué polars?
- siempre intenta comprender lo que escribes (incluso si eso significa leer la documentación de cada función llamada en tu código).
Luego, especifica tu problema. Tu mensaje inicial y #6 son demasiado vagos para que sepamos qué quieres hacer.
- ¿Cuál es la estructura de los archivos CSV?
- ¿Cuáles son los parámetros de tu programa?
- ¡Ni siquiera sabemos qué se supone que debemos pasar como parámetro a tu programa!
- ¿Cuál es el resultado esperado? ¿Cómo se obtiene?
- Dar un ejemplo mínimo ayudaría a entender mejor.
- ¿Cuál es el contexto? ¿Necesitas consultar varias veces este conjunto de archivos, con diferentes consultas?
- Si es así, serializar los archivos (ver pickle), e incluso el dataframe resultante, sería sin duda una buena idea (no tendrías que pagar el costo del análisis de los archivos CSV cada vez que necesitas cargar uno).
Respecto al comentario de Pierrot #9 sobre threading, creo que es discutible. Paralelizar la carga de datos de archivo probablemente no tenga mucho sentido, pero sí para tratarlos. Si el tiempo de carga es relativamente insignificante, en mi opinión, no representa un gran problema. Además, gestionar varios accesos concurrentes a un disco duro es un problema del sistema operativo.
Luego, el tratamiento propuesto (líneas 60 a 80) por ChatGPT me parece catastrófico. En dataframes, si queremos un tratamiento eficiente, evitamos tanto como sea posible los bucles for, de lo contrario pagamos el costo de que "Python es un lenguaje interpretado" del que se hablaba en #1. Por eso, intentamos tanto como sea posible pasar por operaciones vectorizadas. Nunca he utilizado Polars (personalmente suelo utilizar más pandas en general) y nunca haríamos un bucle sobre cada casilla para sumar una columna de un dataframe (ver por ejemplo pd.sum).
De todas formas, ciertamente por un lado es bueno usar Polars para cargar CSV más rápido, pero si detrás trata el archivo así, no es sorprendente que sea horriblemente lento. El problema es que personalmente no he entendido lo que querías extraer/agregar/calcular, así que no puedo decirte qué mirar.
Buena suerte
-
@mamiemando
Le pedí a Google Gemini que resolviera un problema cuya solución ya conocía.
Me proporcionó una respuesta muy poco efectiva. Le envié la mía, que era mucho mejor.
Le hice notar la situación.
Por un lado sorprendente, entendió por qué mi solución era mejor que la suya.
Empiezo una nueva sesión y le pregunto la misma pregunta. Me dio de nuevo su antigua solución, y no la que supuestamente había entendido por qué era mejor.Para mí no es el tema, pero voy a responder rápidamente. Encontrar una librería, un módulo, una clase o una función para satisfacer una necesidad es una cuestión bastante "sencilla". De hecho, a menudo podemos salir adelante sin IA (una búsqueda tradicional en Google suele ser suficiente para encontrar un recurso claro tipo Stack Overflow). Uno de los muchos problemas de una IA es que, como dijiste, puede quedarse atrapada en un problema un poco más complicado y/o responder algo incorrecto, por lo que es un apoyo relativamente fiable, pero no completamente fiable. Y no hablo de los aspectos medioambientales.
-
Hola,
Esta pregunta ya tiene un tiempo, pero bueno.
El día en que la IA responda correctamente a la pregunta "¿cuál era el color del caballo blanco de Enrique IV?", comenzaré a confiar plenamente en ella.
Cuando le hagas una pregunta a una IA, asegúrate de que esté bien formulada, una IA sigue siendo básica.
Si le pides un código, especifica el lenguaje deseado.
Si no conoces las bases de ese lenguaje, comienza pidiéndole las bases.
Si quieres un código preciso, dile que factorice el código para obtener un resultado más conciso.
No olvides que una IA no ve más allá de su nariz, no es capaz de ir más allá de la tercera pregunta.
Una IA sigue siendo asombrosa en su capacidad de producción. Le confío la documentación de mis códigos, especificando que no los modifique.
Para concluir, una IA te proporcionará todas las respuestas que necesitas, pero es necesario no apresurarse.
Para cada tarea, pregúntale qué lenguaje de programación es el más apto para resolver tu problema, cuál es la base de vocabulario del lenguaje elegido, y que te proporcione un esquema de las tareas que tu programa debe realizar.
La IA debe ser una ayuda para el análisis, y no un mero generador de código. El código que produce una IA es, a la larga, inutilizable.
-
Hola,
Python no es rápido (lenguaje interpretado)
Para rapidez: C, C++ y otros lenguajes compilados.
-
- Es un mal consejo y además está medio equivocado, porque olvida que en Python puedes recurrir a código compilado (típicamente en C/C++). Esta es la razón por la cual bibliotecas como pandas u openpyxl permiten en Python tener un rendimiento comparable para procesar tales archivos.
- Si te adentras en C/C++, te enfrentarás a otras dificultades: aprender un nuevo lenguaje, nuevos conceptos de los que no te preocupas en Python, tener que instalar un entorno para compilar código C/C++, y muchas más.
-
-
también depende de lo que hagas en tus archivos
100,000 no es tan enorme.
-
Estoy realizando una búsqueda y luego la suma de esta búsqueda, escribiendo el resultado de esta suma en la columna asociada a la búsqueda, añadiendo la fecha de esta búsqueda mientras muevo hacia la derecha los datos ya presentes en el archivo y eliminando toda columna a partir de la columna 41.
import os import polars as pl import time from concurrent.futures import ThreadPoolExecutor, as_completed DOSSIIR_CSV = r"D:\PYTHON\VALEUR REMPLACER ZIP" FICHIER_REBASE = r"D:\PYTHON\REBASE.csv" def get_dates_and_dicts(): df = pl.read_csv(FICHIER_REBASE, separator=";", encoding="utf8-lossy", has_header=False) dicts = [ { str(k).strip().replace('"', '').replace("'", ''): str(v).strip().replace('"', '').replace("'", '') for k, v in zip(df[:, i].to_list(), df[:, i+1].to_list()) } for i in range(0, 19, 3) ] def get_date(col): return str(df[1, col]) if df[1, col] is not None else (str(df[0, col]) if df[0, col] is not None else "Fecha No Encontrada") dates = [get_date(i) for i in range(0, 19, 3)] return (*dicts, *dates) def make_unique_columns(columns): seen = {} unique_columns = [] for name in columns: if name in seen: seen[name] += 1 new_name = f"{name}_{seen[name]}" else: seen[name] = 0 new_name = name unique_columns.append(new_name) return unique_columns def traiter_fichier(fichier, *args): dicts = args[:7] dates = args[7:] chemin = os.path.join(DOSSIIR_CSV, fichier) try: if os.path.getsize(chemin) == 0: return f"❌ {fichier} error: archivo vacío" with open(chemin, 'r', encoding='utf8', errors='ignore') as f: first_line = f.readline() nb_columns = len(first_line.strip().split(";")) unique_names = [f"column_{i}" for i in range(nb_columns)] df = pl.read_csv(chemin, separator=";", has_header=False, new_columns=unique_names, encoding="utf8-lossy").fill_null("") n_rows = df.height if df.width < 85: df = df.hstack([pl.Series([""] * df.height).alias(f"column_{i}") for i in range(df.width, 85)]) rows = df.to_numpy() def calculer_somme(dico, row): total = 0 for j in range(20): key = str(row[j]).strip().replace('"', '').replace("'", '') val = dico.get(key, "") try: total += float(val) if val.replace(".", "", 1).isdigit() else 0 except: total += 0 return str(int(total)) for col_index, dico in zip(range(20, 27), dicts): somme = [calculer_somme(dico, row) for row in rows] for i in range(n_rows): if str(rows[i][col_index]).strip(): for j in range(len(rows[i]) - 1, col_index, -1): rows[i][j] = rows[i][j - 1] rows[i][col_index] = somme[i] final_columns = make_unique_columns([f"column_{i}" for i in range(len(rows[0]))]) df = pl.DataFrame({ col: ["" if val is None else str(val) for val in rows[:, idx]] for idx, col in enumerate(final_columns) }) date_cols = [pl.Series(final_columns[i], [date] + df[1:, i].to_list()) for i, date in zip(range(20, 27), dates)] df = df.with_columns(date_cols) df = df[:, 0:41] df.write_csv(chemin, separator=";", include_header=False, quote_style="never") return f"✅ {fichier} OK" except Exception as e: return f"❌ {fichier} error: {e}" if __name__ == "__main__": start = time.time() args = get_dates_and_dicts() total = 0 with ThreadPoolExecutor(max_workers=os.cpu_count()) as executor: futures = [ executor.submit(traiter_fichier, f.name, *args) for f in os.scandir(DOSSIIR_CSV) if f.name.endswith(".csv") and f.is_file() ] for f in as_completed(futures): print(f.result()) total += 1 print(f"\n✅ {total} archivos procesados con éxito!") print(f"⏱️ Tiempo total de ejecución: {time.time() - start:.2f} segundos")Hola Lillie3887,
Le pedí a Grok3 (la IA de X) que analizara este código, luego le indiqué "Este script presenta problemas de tiempos de ejecución demasiado lentos. ¿Qué soluciones puedes proponer?". Esto dio lugar a este intercambio:
https://x.com/i/grok/share/ylqcVgTBKX10zUe7KuNv4lPpW
(ver el detalle de las propuestas de optimización, algunas de las cuales fueron mencionadas por mamiemando) y de las cuales Grok3 propone el código o ilustraciones de implementación.
Grok3 concluye:
Estimación de ganancias
-
Vectorización: Puede reducir el tiempo de cálculo de las sumas entre un 50 y un 90 % según el tamaño de los datos.
-
Optimización E/S: Reducción del 10 al 30 % del tiempo de lectura/escritura.
-
Paralelismo con ProcessPoolExecutor: Hasta 2 veces más rápido si los cálculos dominan.
-
Parquet (si es aplicable): Hasta 5 veces más rápido para la lectura/escritura en archivos grandes.
Prueba cada optimización individualmente con un subconjunto de archivos y perfila para confirmar las ganancias. Si tienes detalles sobre el tamaño de los archivos o el hardware utilizado, ¡puedo afinar estas recomendaciones!
Grok3 no es especialmente una IA reputada por la programación (Gemini, Claude Sonnet y ChatGPT son más reputados para eso), pero es lo que tenía a mano, y ofrece pistas para investigar.
De hecho, es una optimización a ciegas porque sin un conjunto de datos y un ejemplo simplificado de los datos de entrada y el resultado que deseas alcanzar, no se puede realmente entender lo que quieres hacer ni si este tipo de soluciones son apropiadas. Tampoco has respondido a las diferentes preguntas planteadas por mamiemando, las cuales son preguntas que un profesional se haría (cuyas respuestas son información que probablemente no le diste a tu IA tampoco).
Programar es una profesión, o al menos, se aprende. Un programador resuelve problemas con un algoritmo adecuado y código. Para ello, debe comprender el problema. Un programador puede luego utilizar una IA como otra herramienta para tener un código simple del cual sabe valorar la pertinencia respecto al problema que ya ha comprendido. Si no sabes programar en Python (ni programar en general), ni expresar tu problema, y estás utilizando una herramienta que adivina la naturaleza de tu solicitud y ofrece respuestas que considera las más estadísticamente correctas según sus datos de entrenamiento y que puede, incluso con un problema muy claramente expresado, ofrecerte respuestas incorrectas, incompletas, aproximadas o irrelevantes (en el estado actual de la tecnología), es problemático.
El hecho de que el código no esté optimizado es un mal menor, si hace realmente lo que quieres que haga... supongo que lo has verificado.
Si no lo has hecho, te recomiendo encarecidamente que lo hagas.
Dal
-
-