【发布时间】:2011-07-15 08:38:32
【问题描述】:
我有一个包含几百万个对象的模型。每个对象代表公司拨打/接听的电话。
为简化起见,假设这个模型 Call 具有以下字段:
调用日期、上下文、频道。
我的目标是了解当月一天中每个小时的平均拨打和接听电话数(按小时加载)。问题是:我需要分别为 port1 和 port2 找到这个。
截至目前,我的代码运行良好,只是需要大约 1 分钟才能给我 4 个月的结果,而且我似乎效率极低。
我做了一些简单的分析,发现 extend 占用了大约 99% 的处理时间:
queryset = Call.objects.filter(calldate__gte='SOME_DATE')
port1, port2 = [],[]
port1.extend(queryset.filter(context__icontains="e1-1"))
port2.extend(queryset.filter(context__icontains="e1-2"))
channels_in_port1 = ["Port/%d-2" % x for x in range(1,32)]
channels_in_port2 = ["Port/%d-2" % x for x in range(32,63)]
for i in channels_in_port1:
port1.extend(queryset.filter(channel__icontains=i))
for i in channels_in_port2:
port2.extend(queryset.filter(channel__icontains=i))
port1 和 port2 现在组合了大约 150k 个对象。
当我收到所有对 port1 和 port2 的调用后,我就可以开始了。其余代码基本上是 port1 和 port2 的一些 for 循环,它们根据小时/天/月总结并取平均调用次数。琐碎的东西。
我试图通过使用 itertools.chain 并链接查询集来避免使用任何“扩展”。但是,这使得处理时间转移到我执行琐碎的 for 循环以按小时计算负载的部分。
还有其他选择吗?过滤查询集的更好方法?
非常感谢!!
【问题讨论】:
-
你能贴出你的模型的代码吗?