有效的方法来计算多个时间段内的前10名或前X名名单

2024-04-18 12:35:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的:计算最流行的搜索查询:过去一天,过去30天,过去60天,过去90天,每个日历月,以及所有时间。在

我的原始数据是一个带有时间戳的搜索查询列表,并且我已经在运行一个夜间cron作业来进行相关的数据聚合,所以我想将这个计算集成到其中。阅读每个查询对于一个每日的统计来说是很好的(而且据我所知是必要的),但是对于其他时间段,这将是一个昂贵的计算,所以我正在寻找一种方法来使用我预先计算的数据来节省时间。在

我不想做的是:提取时段内每一天的记录,合计所有的计数,对整个结果列表进行排序,并取前X个值。这将是低效的,尤其是对于“所有时间”列表。在

我考虑过使用堆和二叉树来保持实时排序和/或更快地访问数据,并行地从每个列表中读取单词,并在各种约束和结束条件下将它们的值推入堆中,但这总是会破坏查找时间或排序时间,我基本上又会重新查看所有内容。在

我还想过保持每个时间段的总计数,加上最近的一天,减去最早的一天(每月1日保存每月的总数),但之后我必须每天保存每个时间段的完整计数(而不仅仅是前X),我仍然在查看每日总计中的每一条记录。在

有没有什么方法可以更快地完成这个任务,也许是使用一些其他的数据结构,或者是我不知道的有趣的数学属性?另外,任何人都需要知道,这整件事都在Django项目中。在


Tags: 数据方法列表原始数据排序作业记录时间
3条回答

我不确定它是否适合您所做的,但是如果数据是通过Django模型存储的,您可以利用聚合来在单个查询中获取信息。在

给予:

class SearchQuery(models.Model):
    query = models.CharField()
    date = models.DateTimeField()

然后:

^{pr2}$

这是使用Django时最有效的方法,但它不一定是效率最高的。但是,像为query添加索引之类的操作会有很大帮助。在

编辑

我突然想到你会在名单上被愚弄。从技术上讲,您可以在事后对列表进行重复数据消除,但是如果您运行的是django1.4+和PostgreSQL作为数据库,那么您可以简单地将.distinct('query')添加到这些查询集的末尾。在

可以使用Counter()类,它是高性能容器数据类型的一部分。创建一个包含所有搜索的字典,并将其作为字典的键,并计算搜索频率。在


cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1
print cnt
Counter({'blue': 3, 'red': 2, 'green': 1})

简单的回答是不

不能保证去年前十名的歌曲曾经出现在每日十大排行榜上(很有可能,但不能保证)。在

获得绝对肯定的前十名的唯一方法是将指定时间段内的所有选票相加,然后选择前十名。在

相关问题 更多 >