对于有游戏化的项目,我认为我有一个非常常见的任务。
例如,您拥有存储所有用户解决方案的模型,并且每个解决方案都有分数
class Solutions(models.Model):
text = models.TextField()
score = models.IntegerField()
for_top = models.BooleanField()
def get_place(self):
return list(Solutions.objects.filter(for_top=True)).index(self) + 1
有没有办法为方法get_place
找到更优化的解决方案?
答案 0 :(得分:0)
next(i for i, x in enumerate(Solutions.objects.filter(for_top=True), 1) if x is self)
基本上这使用两个优化。 next(iterable)
代替list(iterable).index
是显而易见的:next
不是将所有内容存储在内存中,而是遍历并返回第一项。因此它会短路并且不会占用内存。
此外,它使用is
代替==
,这是一种更快的操作。