哪一个更有效率?

时间:2012-02-13 07:12:38

标签: python sqlite

我有一个Python程序,用于从名单列表中删除重复项。

但是我处于两难境地,并且正在寻找一种最有效的方法。

我已将一个名称列表上传到SQLite数据库,并将其上传到表格的列中。

是否比较名称并在数据库中删除它们的重复项是好的,或者将它们加载到Python意味着将它们加入Python并删除重复项并将它们推回到DB是好的?

我很困惑,这是在SQLite上执行此操作的一段代码:

dup_killer (member_id, date) SELECT * FROM talks GROUP BY member_id, 

1 个答案:

答案 0 :(得分:3)

如果您将名称用作数据库中的键,则数据库将确保它们不会重复。因此没有理由将列表发送到Python并在那里进行重复数据删除。

如果您尚未将名称插入数据库,您可以先在Python中删除它们。使用内置功能在Python中执行此操作可能比在重复尝试插入数据库时​​产生的开销更快。

(顺便说一句:如果你在一个事务中包装所有插入,你可以真正加速插入许多名称。启动事务,插入所有名称,然后完成事务。数据库做了一些工作来做确保数据库是一致的,并且对于整个名称列表而言,只需要执行一次,而不是每个名称执行一次,这对于 更高效。)

如果您拥有Python中的列表,则可以使用内置功能快速删除它。对重复数据删除有用的两个常用功能是setdict

我给了你三个例子。最简单的情况是,您有一个只包含名称的列表,并且您希望获得一个只有唯一名称的列表;您可以将列表放入set。第二种情况是您的列表包含记录,您需要提取名称部分以构建集合。第三种情况显示了如何构建将名称映射到记录的dict,然后将记录插入到数据库中;与set类似,dict只允许将唯一值用作键。构建dict后,它将保留列表中具有相同名称的 last 值。

# list already contains names
unique_names = set(list_of_all_names)
unique_list = list(unique_names) # lst now contains only unique names

# extract record field from each record and make set
unique_names = set(x.name for x in list_of_all_records)
unique_list = list(unique_names) # lst now contains only unique names

# make dict mapping name to a complete record
d = dict((x.name, x) for x in list_of_records)
# insert complete record into database using name as key
for name in d:
    insert_into_database(d[name])