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

Rispondere a