У меня есть модель, которая имеет пару миллионов объектов. Каждый объект представляет собой вызов, сделанный / полученный компанией.
Для упрощения, скажем, эта модель Call имеет следующие поля:
calldate, context, channel.
Моя цель - узнать среднее количество звонков, совершенных и полученных в течение каждого часа дня месяца (загрузка по часам). Подвох заключается в следующем: мне нужно найти это для port1 и port2 отдельно.
На данный момент мой код работает нормально, за исключением того, что для получения результата в диапазоне от 4 месяцев требуется около 1 минуты, а мне он кажется крайне неэффективным.
Я провел простое профилирование и обнаружил, что расширение занимает около 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 объединяют около 150 тыс. Объектов.
Как только у меня будут все звонки на port1 и port2 , я готов идти. Остальная часть кода - это в основном циклы for для port1 и port2 , которые суммируют и принимают среднее количество вызовов в соответствии с часом / днем / месяцем. Тривиальные вещи.
Я пытался избежать использования какого-либо «расширения», используя itertools.chain и связывая вместо этого наборы запросов. Однако это привело к смещению времени обработки в ту часть, где я выполняю тривиальные циклы for, чтобы вычислить нагрузку по часам.
Есть альтернативы? Лучшие способы отфильтровать набор запросов?
Большое спасибо !!