Почему в Python MySQLdb выполняется так медленно?

Я разрабатываю программу на 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, и похоже, что он ничего не должен делать.

13
задан Elias Zamaria 15 October 2010 в 20:12
поделиться