Cari Guru e Plonisti,
sono alle prese con un portlet per visualizzare gli articoli più commentati.
Inizialmente avevo tentato un approccio, richiamando gli oggetti, poi sapendo
che ovunque viene scritto che richiamare gli oggetti è male e porta a un
notevole rallentamento ho cercato di risolvere il problema usando solamente i
"brains".
Una volta finito, ho confrontato i tempi di esecuzione delle due procedure
[getA() e getB()] e paradossalmente ,in media, la procedura che rievoca tutti
gli oggetti è anche se di poco più veloce (anche se con un wrost case, anche se
raro, molto elevato)
Da qui la mia domanda: ho sbagliato qualcosa io o il comportamento è dovuto
perchè l'ho testato su un istanza con pochi oggetti (<10) ?
Grazie
----------- code -------
def getA(self):
"""
cerca gli articoli che in un determinato periodo di tempo hanno
avuto piu commenti
ritorna una collezzione di Oggetti (e non brains!)
"""
da = DateTime()
giorni_fa = 28
today = DateTime().Date() # returns a string yyyy/mm/dd
today = DateTime(today) # converts the string back to a date
object
putils = getToolByName(self, 'plone_utils')
# used for getDiscussionThread()
catalog = getToolByName(self, 'portal_catalog')
# collect brains
brains = catalog(
portal_type='Discussion
Item',
created={
'query': today - giorni_fa,
'range': 'min'
},
sort_by='cmf_uid',
review_state=
'published',
)
#frequency counter
freq = {}
for brain in brains:
item = putils.getDiscussionThread(brain.getObject())[0]
if item in freq:
freq[item] +=1
else:
freq[item] = 1
#sort Objects by frequancy of occurrence
result = sorted(freq, key=freq.get , reverse=True)
print "esecuzione chiamando oggetti"
print DateTime() - da
return result
def getB(self):
"""
cerca gli articoli che in un determinato periodo di tempo hanno
avuto piu commenti
ritorna una lista iterabile di di Brains
"""
da = DateTime()
giorni_fa = 28
today = DateTime().Date() # returns a string yyyy/mm/dd
today = DateTime(today) # converts the string back to a date
object
putils = getToolByName(self, 'plone_utils')
# used for getDiscussionThread()
catalog = getToolByName(self, 'portal_catalog')
# collect brains
brains = catalog(
portal_type='Discussion
Item',
sort_by='cmf_uid',
created={'query': today
- giorni_fa,
'range': 'min'
},
review_state=
'published',
)
#frequency counter - RIVISTO
freq = {}
for brain in brains:
item = brain["cmf_uid"]
if item in freq:
freq[item] +=1
else:
freq[item] = 1
result=[]
#sort Objects by frequancy of occurrence
for uid in sorted(freq, key=freq.get , reverse=True):
reference = catalog(
cmf_uid=uid,
created={'query': today
- giorni_fa,
'range': 'min'
},
portal_type='News Item',
review_state=
'published',
)[0]
result.append(reference)
print "tempo esecuzione usando solo brains"
print DateTime() - da
return result[:5]
------------- / code ------------------
l'ordine di grandezza dei tempi e questo
A B
1.85187673196e-07 3.58799297828e-07
3.47208697349e-08 4.63041942567e-08
2.6620546123e-07 1.62035576068e-07
4.62896423414e-08 4.62896423414e-08
Caso peggiore
1.13426358439e-06 5.78656909056e-08
nella maggior parte dei casi i tempi di getA sono inferiori a getB
_______________________________________________
Plone-IT mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/plone-it
http://www.nabble.com/Plone---Italy-f21728.html