Python性能:搜索大型列表与sqlite

时间:2010-08-04 10:18:39

标签: python performance sqlite

假设我有一个数据库表,其中包含三列:idfield1field2。该表中可能包含100到100,000行。我有一个python脚本,应该在此表中插入10-1,000个新行。但是,如果表格中已存在新的field1,则应该UPDATE,而不是INSERT

以下哪种方法更有效?

  1. 执行SELECT field1 FROM tablefield1是唯一的)并将其存储在列表中。然后,对于每个新行,使用list.count()来确定是INSERT还是UPDATE
  2. 对于每一行,运行两个查询。首先,SELECT count(*) FROM table WHERE field1="foo"然后是INSERTUPDATE
  3. 换句话说,执行n + 1个查询和搜索列表,或2n个查询并获取sqlite进行搜索是否更有效?

4 个答案:

答案 0 :(得分:9)

如果我理解你的问题,似乎你可以简单地使用SQLite内置的冲突处理机制。

假设你对field1有一个UNIQUE约束,你可以简单地使用:

INSERT OR REPLACE INTO table VALUES (...)

还支持以下语法(相同的语义):

REPLACE INTO table VALUES (...)

编辑:我意识到我并没有真正回答你的问题,只是提供一个应该更快的替代解决方案。

答案 1 :(得分:1)

我不熟悉sqlite,但这样的一般方法应该有效:

如果field1上有唯一索引,并且您尝试插入已存在的值,则应该收到错误消息。如果插入失败,则进行更新。

伪代码:

try
{
    insert into table (value1, value2)
}
catch(insert fails)
{
    update table set field2=value2 where field1=value1
}

答案 2 :(得分:0)

我想使用python字典可以比使用python列表更快地进行搜索。 (只需将值设置为0,您就不需要它们,希望紧凑地存储'0'。)

至于更大的问题,我也很好奇。 :)

答案 3 :(得分:0)

您似乎正在将苹果与橙子进行比较。

python列表仅在您的数据适合进程的地址空间时才有用。一旦数据变大,这将不再有效。

此外,python列表未编入索引 - 因此您应该使用字典。

最后,python列表是非持久的 - 当进程退出时会忘记它。

你怎么能比较这些?