Почему python быстрее, чем c++, при вставке в базу данных?

У меня есть массив из 100 элементов, называемых «элементами».

Python (займет около 1 секунды):

for item in items:
           cur.execute("INSERT INTO list VALUES (?)",(item,))
db.commit()

C++ (9 секунд):

for ( auto it = items.begin(); it != items.end(); ++it  ) {
    qry.prepare("INSERT INTO list VALUES (?)");
    std::string item = *it;
    qry.addBindValue(item);
    qry.exec();

C++ без prepare (9 сек):

for ( auto it = items.begin(); it != items.end(); ++it  ) {
    std::string item = *it;
    qry.exec("INSERT INTO list VALUES ('"+item+"')");

В основном мой вопрос заключается в том, есть ли способ использовать insert в C++ так же быстро, как в Python.

Тот факт, что вы commit один раз в конце своего питона и, похоже, не выполняете транзакцию в C++, может объяснить разницу.

François Andrieux 13.09.2018 20:44
qry.exec("INSERT INTO list VALUES (*item)"); на самом деле не будет делать то, что вы хотите. В зависимости от того, что такое *item, вам понадобится что-то вроде: qry.exec("INSERT INTO list VALUES (" + *item + ")");
NathanOliver 13.09.2018 20:47

Помните, что вы можете подготовиться один раз и связать / выполнить несколько раз.

tadman 13.09.2018 20:57

Даже метод python не оптимизирован, потому что вы можете использовать executemany. Я подозреваю, что ваш тест ошибочен

roganjosh 13.09.2018 20:58

Ваш обновленный код все еще содержит ошибки. qry.exec("INSERT INTO list VALUES (item)"); будет вставлять слово «элемент» для каждой записи. Вам нужен qry.exec("INSERT INTO list VALUES (" + item +")"); или, возможно, qry.exec(("INSERT INTO list VALUES (" + item +")").c_str());

NathanOliver 13.09.2018 21:01

Обычно вы не подготавливаете заявление каждый раз, когда собираетесь его использовать. Приготовьте один раз, используйте много раз.

Galik 13.09.2018 21:01

Вы можете удалить базу данных из своего профилирования. Попросите каждую языковую версию выводить текст SQL в файл. Мера. Затем возьмите файлы SQL и введите их в базу данных, измерьте. Определите, можете ли вы протестировать программы, обращающиеся непосредственно к базе данных, и произвести измерения. Я считаю, что скорость зависит не от языков, а от интерфейса или взаимодействия с базой данных.

Thomas Matthews 13.09.2018 21:17
2
7
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это правильный способ быстрой пакетной вставки в C++.

Менее 1 секунды:

db.transaction();

for ( auto it = items.begin(); it != items.end(); ++it  ) {
    std::string item = *it;
    qry.exec("INSERT INTO list VALUES ('"+item+"')");
}

db.commit();

Другие вопросы по теме