我已经分析了一段代码,用于处理350行的Excel电子表格,大约200行。 75.5%的时间用于这个多对多的呼叫:
332 388 117059833 301700.6 75.5 if obj.wave not in c.waves.all():
以下是其余的大部分内容:
136 97 341749 3523.2 0.2 q.waves.add(obj.wave)
137 97 30551176 314960.6 19.7 q.save()
波是一个模型,
obj有一个外键字段来传播
wave = models.ForeignKey(Wave)
和q有多对多的波场
waves = models.ManyToManyField(Wave)
我检查过很多桌子,每个场都有一把钥匙。我已经将它从ISAM改为Innodb而没有任何区别。
我能做些什么来提高性能 - 它目前每行需要20秒,并在2核linux盒子上使用所有CPU - 在我重写代码以摆脱多对多结构之前?
答案 0 :(得分:3)
如果in
条记录太多,waves
操作可能会非常昂贵,您可以将查询简化为:
if not c.waves.filter(id__exact=obj.wave.id).exists():
pass # do something