gpt4 book ai didi

python - Django DB优化过滤器点击ip和1小时差异

转载 作者:行者123 更新时间:2023-11-30 00:27:23 24 4
gpt4 key购买 nike

您好,我需要从我的数据库上的访问中获取计数,此访问是来自不同ip的点击,最小差异为1小时,我现在可以使用此代码获取它:

visits = get_visits_number(App_hit.objects.filter(app_id__campaign_id__agency_id=agency).all())

def get_visits_number(hits):
if hits:
ips = {}
date = {}
for hit in hits:
if hit.hit.remote_addr in ips:
if hit.hit.created > date[hit.hit.remote_addr] + timedelta(hours=1):
ips[hit.hit.remote_addr] = ips[hit.hit.remote_addr] + 1
date[hit.hit.remote_addr] = hit.hit.created
else:
ips[hit.hit.remote_addr] = 1
date[hit.hit.remote_addr] = hit.hit.created

total = 0
for ip in ips:
total = total + ips[ip]

return total

return 0

但是,如果点击次数超过 4.000,则需要花费很多时间,超过 30 秒,是否有任何建议可以编写更好更快的代码?

最佳答案

我尝试过一些解决方法。还没有找到一些重要的好的解决方案。关键是,无论你的查询语句如何,你的 get_visits_number 基本上都是线性的。有某种更简洁的方式来编写代码,但对性能没有任何改善。

然而,真正困扰我的是 hit.hit.remote_addr。第一个“命中”应该是 App_hit 的实例,对吧?那么第二个‘打击’是什么呢?另一个例子? App_hit 的外键?您可能遇到的一个潜在问题是 hit.hit(如果不是拼写错误)将导致再次数据库命中以从 hit.hit 检索数据。您可能希望在 Django 查询中使用 select_lated ,它将立即检索所有数据。

第二种可能的解决方案,您可能不喜欢它,正如 Robert Rozas 所说,您应该尝试将尽可能多的数据操作操作放入查询中(但这可能是不可能的)。 DB 比 python 解析器快得多。如果标准化的Django ORM不能满足你,那么你可以尝试原始的sql查询,它很难编写和维护。如果你真的那么在乎的话,原始 sql 查询肯定会提高你的运行速度。

关于python - Django DB优化过滤器点击ip和1小时差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765923/

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