On 12/10/14, Oleg Broytman <p...@phdru.name> wrote: > On Wed, Dec 10, 2014 at 01:09:50AM +0100, "Fetchinson ." > <fetchin...@googlemail.com> wrote: >> On 12/10/14, Oleg Broytman <p...@phdru.name> wrote: >> > you'd better implement your own >> > caching with proper locking. >> >> Well, that was exactly the question, how would I do that? :) >> Precisely for the reason you mention above I was wary of using a more >> or less standard caching decorator. Can't I attach the computed value >> to the instance itself somehow by setting a new property? > > The classical approach is: > > def __init__(self): > self.__cache = None > self.__cache_lock = Lock() > > def _get_value(self): > if self.__cache is not None: > return self.__cache > self.__cache_lock.acquire() > try: > if self.__cache is not None: # Calculated in another thread > return self.__cache > self.__cache = ...do expensive calculation once... > return self.__cache > finally: # finally works both for exceptions and returns > self.__cache_lock.release()
Great, thanks a lot, this will get me started. But I was thinking, maybe I'm doing things not in an optimal way: the reason I thought about caching is that my expensive property really takes a long time. I have 'collections' which can contain 'articles' and 'articles' can be 'tagged'. So there is a many-to-many relationship between 'articles' and 'tags' done by RelatedJoin in both directions. What I'd like to have is for each 'collection' have a list of [ ( 'tag1', 'number-of-articles' ), ( 'tag2', 'number-of-articles' ), ..... ] so for each 'collection' a list of all tags and the number of articles associated with each tag. And for a collection of even moderate size, let's say about 1000 articles and about 100 tags, this take on the order of 2-3 seconds. This is my current approach: class collection( SQLObject ): articles = MultipleJoin( 'article' ) class article( SQLObject ): tags = RelatedJoin( 'tag' ) class tag( SQLObject ): name = StringCol( ) articles = RelatedJoin( 'article' ) def _get_articlecount( self ): """Count number of articles with given tag.""" # maybe this could be done better? return tag.select( tag.q.name == self.name ).throughTo.items.count( ) coll = collection.get( 1 ) # get list of all articles, then list of all distinct tags of all articles # I guess this could be done also better? tags = { } for art in coll.articles: for tag in art.tags: tags[tag] = 1 tags = tags.keys( ) # the above is quite slow, but the following is slower still # how could I speed this up? result = [ ( tag, tag.articlecount ) for tag in tags ] Cheers, Daniel > Oleg. > -- > Oleg Broytman http://phdru.name/ p...@phdru.name > Programmers don't die, they just GOSUB without RETURN. > > ------------------------------------------------------------------------------ > Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server > from Actuate! Instantly Supercharge Your Business Reports and Dashboards > with Interactivity, Sharing, Native Excel Exports, App Integration & more > Get technology previously reserved for billion-dollar corporations, FREE > http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk > _______________________________________________ > sqlobject-discuss mailing list > sqlobject-discuss@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss > -- Psss, psss, put it down! - http://www.cafepress.com/putitdown ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk _______________________________________________ sqlobject-discuss mailing list sqlobject-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss