我在试着加快我的模特的查找速度。我有三个模特。
class sett(models.Model):
setid = models.IntegerField(primary_key=True)
block = models.ForeignKey(mapt, related_name='sett_block')
class data_parsed(models.Model):
setid = models.ForeignKey(sett, related_name='data_parsed_setid', primary_key=True, db_index = True)
setid_hash = models.CharField(max_length=100, db_index = True)
class unique_variables(models.Model):
setid = models.ForeignKey(sett, related_name='unique_variables_setid', db_index = True)
setid_hash = models.CharField(max_length=100, db_index = True)最重要的是,sett有一个名为setid的主键,它:
data_parsed和unique_variables有一个用于setid的外键
data_parsed: 300万行
unique_variables: 1300万行
然后,我有一些代码试图遍历所有的data_parsed对象。
def something_1():
timeNow = datetime.datetime.now()
for i in range(0,N) <---- N is predefined, and no less than 10
for contents in data_parsed.objects.all().iterator():
pass
timeEnd = datetime.datetime.now()
print str(timeEnd - timeNow)data_parsed有几百万个项目,大约需要20秒才能完成,我认为这个速度相当快。
现在,因为setid在data_parsed和unique_variables上都是相同的字段。我可以使用unique_variables中的data_parsed键获取项目。因此:
def something_2():
timeNow = datetime.datetime.now()
for i in range (0, N) <---- N is predefined, and no less than 10
for contents in data_parsed.objects.all().iterator():
try:
items = unique_variables.objects.get(setid = contents.setid)
except:
pass
timeEnd = datetime.datetime.now()
print str(timeEnd - timeNow)然而,问题是,这突然消耗了几个小时的时间。因为我不能使用select_related,因为我不会返回到sett,而是实际上从sett迁移到unique_variables。
有什么方法可以加速使用这种行为获取物品吗?
发布于 2015-03-07 00:39:50
是的,你可以使用相关。我已经帮你把文件联系起来了。
def something_2():
timeNow = datetime.datetime.now()
for i in range (0, N) <---- N is predefined, and no less than 10
parsed_objects = data_parsed.objects.all().prefetch_related(
'setid__unique_variables_setid')
for contents in parsed_objects:
try:
items = list(contents.setid.unique_variables_setid.all())
except:
pass
timeEnd = datetime.datetime.now()
print str(timeEnd - timeNow)https://stackoverflow.com/questions/28909781
复制相似问题