Estoy desarrollando un programa en Python que accede a una base de datos MySQL utilizando MySQLdb. En ciertas situaciones, tengo que ejecutar un comando INSERTAR o REEMPLAZAR en muchas filas. Actualmente lo estoy haciendo así:¿Por qué es lento ejecutar en Python MySQLdb?
db.execute("REPLACE INTO " + table + " (" + ",".join(cols) + ") VALUES" +
",".join(["(" + ",".join(["%s"] * len(cols)) + ")"] * len(data)),
[row[col] for row in data for col in cols])
Funciona bien, pero es un poco incómodo. Me preguntaba si podría facilitar la lectura, y descubrí el comando executemany. Cambié mi código para que se vea así:
db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " +
"VALUES(" + ",".join(["%s"] * len(cols)) + ")",
[tuple(row[col] for col in cols) for row in data])
Aún funcionaba, pero funcionaba mucho más lento. En mis pruebas, para conjuntos de datos relativamente pequeños (alrededor de 100-200 filas), se ejecutó aproximadamente 6 veces más lento. Para grandes conjuntos de datos (alrededor de 13,000 filas, la más grande que espero manejar), se ejecutó unas 50 veces más lento. ¿Por qué está haciendo esto?
Realmente me gustaría simplificar mi código, pero no quiero la gran caída en el rendimiento. ¿Alguien sabe de alguna manera para hacerlo más rápido?
Estoy usando Python 2.7 y MySQLdb 1.2.3. Traté de jugar con la función setinputsizes, pero eso no pareció hacer nada. Miré el código fuente MySQLdb y parece que no debería hacer nada.
¿cuántas filas está insertando/reemplazando? su segunda declaración crea una gran lista en la memoria antes de alimentarlo a mysql. – nosklo
Estoy reemplazando hasta 13,000 filas. No creo que crear la lista sea el cuello de botella. Si creo la lista pero no la paso al cursor db, apenas toma tiempo. –
(No responderá la pregunta, pero ...) 'INSERTAR ... EN ACTUALIZACIÓN DE LLAVE DUPLICADA ...' casi siempre es mejor que 'REEMPLAZAR ...'. –