gpt4 book ai didi

python - Django:如何创建排行榜

转载 作者:太空狗 更新时间:2023-10-29 21:07:54 31 4
gpt4 key购买 nike

假设我有大约 1,000,000 名用户。我想找出任何给定用户所处的位置,以及他周围有哪些用户。用户可以随时获得新的成就,如果能看到自己的状态更新,那就太好了。

老实说,我想到的每一种方法都会在时间和/或内存方面非常昂贵。想法?到目前为止,我最接近的想法是对用户进行离线排序并构建百分位数桶,但这无法向用户显示他的确切位置。

一些代码如果可以帮助你 django 人:

class Alias(models.Model) :
awards = models.ManyToManyField('Award', through='Achiever')

@property
def points(self) :
p = cache.get('alias_points_' + str(self.id))
if p is not None : return p

points = 0
for a in self.achiever_set.all() :
points += a.award.points * a.count

cache.set('alias_points_' + str(self.id), points, 60 * 60) # 1 hour
return points

class Award(MyBaseModel):
owner_points = models.IntegerField(help_text="A non-normalized point value. Very subjective but try to be consistent. Should be proporional. 2x points = 2x effort (or skill)")
true_points = models.FloatField(help_text="The true value of this award. Recalculated with a cron job. Based on number of people who won it", editable=False, null=True)

@property
def points(self) :
if self.true_points :
# blend true_points into real points over 30 days
age = datetime.now() - self.created
blend_days = 30
if age > timedelta(days=blend_days) :
age = timedelta(days=blend_days)
num_days = 1.0 * age.days / blend_days
r = self.true_points * num_days + self.owner_points * (1 - num_days)
return int(r * 10) / 10.0

else :
return self.owner_points


class Achiever(MyBaseModel):
award = models.ForeignKey(Award)
alias = models.ForeignKey(Alias)
count = models.IntegerField(default=1)

最佳答案

我认为 Counterstrike 通过要求用户达到排名的最低阈值来解决这个问题——您只需要准确地对前 10% 或其他内容进行排序。

如果您想对每个人进行排序,请考虑您不需要对它们进行完美排序:将它们排序为 2 位有效数字。对于 100 万用户,您可以实时更新前 100 名用户的排行榜,接下来的 1000 名用户最接近 10,然后大众最接近 1% 或 10%。你不会在一轮中从第 500,000 名跳到第 99 名。

将 10 个用户上下文置于 500,000 之上和之下是没有意义的——由于指数分布,从一轮到另一轮,群众的排序将令人难以置信地紧张。

编辑:看看 SO leaderboard .现在转到 page 500满分 2500(大约第 20 个百分位数)。告诉代表“157”的人他们两边的 10 个人也有代表“157”有什么意义吗?如果你的代表上升或下降一个点,你将跳 20 个位置。更极端的是,现在底部的 1056 个页面(共 2538 个),或者说底部的 42% 的用户,与代表 1 并列。你再得到一分,你就跳了起来 1055 pages .排名大约增加了 37,000。告诉他们“如果你再得到一分,你就可以击败 37k 人”可能会很酷!但是 37k 这个数字有多少个有效数字重要吗?

在您已经处于顶端之前,了解阶梯上的同龄人没有任何值(value),因为除了顶端之外的任何地方,都有压倒性的数量。

关于python - Django:如何创建排行榜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1391601/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com