我试图将两个对象相互比较。
一个对象是文件列表及其元数据(来自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次迭代,可能并非不合理。无论如何,是否有更高效的方法来实现我删除现有项目的目标?
答案 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)。