我正在開發一個使用MySQLdb訪問MySQL數據庫的Python程序。在某些情況下,我必須在許多行上運行INSERT或REPLACE命令。我目前這樣做:爲什麼executemany在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])
它工作正常,但它有點尷尬。我想知道如果我能夠更容易閱讀,並且我發現了有關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源代碼,看起來它不應該做任何事情。
你插入/替換多少行?你的第二條語句在把它提供給mysql之前會在內存中創建一個巨大的列表 – nosklo 2010-10-15 19:59:08
我正在替換多達13,000行。我認爲創建清單並不是瓶頸。如果我創建列表但不將它傳遞給db光標,它幾乎不需要任何時間。 – 2010-10-15 20:14:36
(不會回答這個問題,但是......)'INSERT ... ON DUPLICATE KEY UPDATE ...'幾乎總是比'REPLACE ...'更好。 – 2017-05-26 05:24:45