【发布时间】:2017-09-23 19:25:48
【问题描述】:
我在使用以下代码时遇到了运行时问题:
# filter start and end date
matches = database.objects.filter(start__gte= Start, end__lte= End)
# iterate through matches
for Item in matches:
# filter database again
test = database.objects.filter(cm1=Item.cm1, cm2=Item.cm2, cm3=Item.cm3)
# compare first item of filter with iterated Item
if test[0] == Item:
TrueRun = True
else:
TrueRun = False
我有一个大约 80k 行的数据库。在第一步中,我过滤了我想要查看的行,通常应该在 8k 左右。在第二步中,我遍历所有这些项目并检查它们是唯一的还是具有某些特定属性的第一个(cm1、cm2、cm3)。
现在的问题是,我执行 8k 数据库查询,总共需要大约 15 分钟。有什么方法可以加速这一点,例如在循环之前使用一个包含cm1 及其匹配行的所有可能性的字典?
感谢您的帮助!
__________________________
评论后编辑
我的模型的默认顺序与此处的使用方式不同。在程序中,我有大约 25 个模型并检查其中大约 12 个是否相等。
循环的其余部分应该没什么意思,因为之前还有另一种检查TrueRun 的方法,大约需要2 分钟。唯一改变的是里面#-----# 见这里:
equalnessList = ['cm1','cm2', 'cm3']
for idx, Item in enumerate(matches):
#-----------------#
TrueRun = True
listTrue = []
for TrueIdx,TrueItem in enumerate(listTrue):
EqualCount = 0
for equCrit in equalnessList:
if getattr(Item,equCrit)!=getattr(matches[TrueItem],equCrit):
EqualCount += 1
if EqualCount == len(equalnessList):
TrueRun = False
break
#------------------#
# Some stuff in here, that can't be changed
if TrueRun:
resDict[getattr(Item,'id')] = [True]
listTrue.append(idx)
else:
resDict[getattr(Item,'id')] = [False]
这里的问题是,它工作不正常,并且没有使用过滤日期之外的数据库条目进行检查。
【问题讨论】:
-
你的模型的默认顺序是什么,你能展示你循环的其余部分吗?你是如何使用
TrueRun的? -
更新了您的评论问题。
标签: python mysql django python-2.7 sqlite