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

Rispondere a