Производительность Python: поиск по большому списку против sqlite - PullRequest
2 голосов
/ 04 августа 2010

Допустим, у меня есть таблица базы данных, которая состоит из трех столбцов: id, field1 и field2.Эта таблица может содержать от 100 до 100 000 строк.У меня есть скрипт Python, который должен вставить 10-1000 новых строк в эту таблицу.Однако, если новый field1 уже существует в таблице, он должен выполнить UPDATE, а не INSERT.

Какой из следующих подходов более эффективен?

  1. Сделайте SELECT field1 FROM table (field1 уникален) и сохраните это в списке.Затем для каждой новой строки используйте list.count(), чтобы определить, следует ли INSERT или UPDATE
  2. . Для каждой строки выполните два запроса.Во-первых, SELECT count(*) FROM table WHERE field1="foo", затем INSERT или UPDATE.

Другими словами, более эффективно выполнять n + 1 запрос и выполнять поиск в списке, или 2n запросов и получать sqliteискать?

Ответы [ 4 ]

9 голосов
/ 04 августа 2010

Если я правильно понимаю ваш вопрос, похоже, вы могли бы просто использовать встроенный в SQLite механизм обработки конфликтов.

Если у вас есть УНИКАЛЬНОЕ ограничение на field1, вы можете просто использовать:

INSERT OR REPLACE INTO table VALUES (...)

Также поддерживается следующий синтаксис (идентичная семантика):

REPLACE INTO table VALUES (...)

РЕДАКТИРОВАТЬ: я понимаю, что на самом деле я не отвечаю на ваш вопрос, просто предлагая альтернативное решение, которое должно быть быстрее.

1 голос
/ 04 августа 2010

Я не знаком с sqlite, но такой общий подход должен работать:

Если на field1 есть уникальный индекс, и вы пытаетесь вставить уже существующее значение, вы должны получить ошибку. Если вставка не удалась, вы идете с обновлением.

псевдокод:

try
{
    insert into table (value1, value2)
}
catch(insert fails)
{
    update table set field2=value2 where field1=value1
}
0 голосов
/ 21 августа 2010

Вы, кажется, сравниваете яблоки с апельсинами.

Список python полезен, только если ваши данные вписываются в адресное пространство процесса. Как только данные станут большими, это больше не будет работать.

Более того, список питонов не индексируется - для этого вам следует использовать словарь.

Наконец, список python непостоянен - ​​он забывается при выходе из процесса.

Как вы можете сравнить их?

0 голосов
/ 04 августа 2010

Я предполагаю, что использование словаря Python позволит гораздо быстрее выполнять поиск, чем использование списка Python.(Просто установите значения 0, они вам не понадобятся, и, надеюсь, «0» будет компактно сохраняться.)

Что касается более крупного вопроса, мне тоже интересно.:)

...