我有一個擁有幾百萬個對象的模型。每個對象代表一個公司發出/接收的呼叫。如何優化使用帶有列表的查詢集
爲了簡化,我們假設這個模型Call有這些字段:
calldate,context,channel。
我的目標是瞭解每月當天的每個小時(每小時加載)發出和接收的平均呼叫數。問題是:我需要分別找到port1和port2。
截至目前,我的代碼工作正常,除了它需要大約1整整一分鐘給我的結果4個月的範圍,我看起來效率非常低。
我已經做了一些簡單的分析,並發現延長正在處理時間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有15萬左右,現在的對象結合。
只要我有端口1和端口2的所有呼叫,我很好去。代碼的其餘部分基本上是一些for循環端口1和端口2,總結和根據小時/日/月平均呼叫。平凡的東西。
我試圖通過使用itertools.chain並鏈接查詢集來避免使用任何「擴展」。但是,這使得處理時間轉移到我爲循環計算每小時負載的重要部分。
任何替代品?更好的方法來過濾查詢集?
非常感謝!
你可以發佈你的模型的代碼? – demux 2011-03-15 00:20:51