Python list / dict比较性能

时间:2014-07-28 02:42:51

标签: python performance python-2.7

我试图将两个对象相互比较。

一个对象是文件列表及其元数据(来自Dropbox),另一个是查询返回的行列表(SqlAlchemy)。

目标是根据文件在数据库中的存在来删除文件中的重复项。

总文件数= 6716 数据库中的总条目= 397

#get dropbox files
files = get_dropbox_files(client, path)

#get rows from Database
exists_row = exists_results.fetchall()

todelete = {}

#start timer
tic = timeit.default_timer()
for k, v in files.iteritems():
    for row in exists_row:
        if row.rev == v['rev'] and row.revision == v['revision']:
            todelete[k] = k

if todelete is not None:
    for t in todelete:
        files.pop(t)

toc = timeit.default_timer()

print toc - tic

打印2.6秒。这似乎很长,虽然给出6716 * 397 = 2,666,252次迭代,可能并非不合理。无论如何,是否有更高效的方法来实现我删除现有项目的目标?

1 个答案:

答案 0 :(得分:0)

以下是对评论中讨论的set解决方案的第一次尝试,

set_db = set( (row.rev,row.revision) for row in exists_row )
for k,v in files.items():
    if (v['rev'],v['revision']) in set_db:
        del(files[k])

它摆脱了一个明确的for循环。集合和字典在Python中实现为哈希表,因此成员资格检查应为O(1)。