Я разрабатываю программу на Python, которая обращается к базе данных MySQL, используя MySQLdb.В определенных ситуациях мне нужно выполнить команду INSERT или REPLACE для нескольких строк.В настоящее время я делаю это так:
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])
Работает нормально, но неловко.Мне было интересно, смогу ли я облегчить чтение, и я узнал о команде executemany.Я изменил свой код, чтобы он выглядел так:
db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " +
"VALUES(" + ",".join(["%s"] * len(cols)) + ")",
[tuple(row[col] for col in cols) for row in data])
Он все еще работал, но работал намного медленнее.В моих тестах для относительно небольших наборов данных (около 100-200 строк) он работал примерно в 6 раз медленнее.Для больших наборов данных (около 13 000 строк, самый большой, который я ожидаю обработать), он работал примерно в 50 раз медленнее.Почему это происходит?
Мне бы очень хотелось упростить мой код, но я не хочу большого падения производительности.Кто-нибудь знает какой-либо способ сделать это быстрее?
Я использую Python 2.7 и MySQLdb 1.2.3.Я пытался возиться с функцией setinputsizes, но это, похоже, ничего не сделало.Я посмотрел на исходный код MySQLdb и похоже, что он ничего не должен делать.