Il 13/10/2010 09:55, iem4voos ha scritto:
> 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) ?
>
Sì, perché sono già nella cache di zope e "freschi". Il catalogo aiuta
quando si possono avere molti risultati.
> 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
>
_______________________________________________
Plone-IT mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/plone-it
http://www.nabble.com/Plone---Italy-f21728.html