odd behavoiur seen

Chris Hinsley chris.hinsley at gmail.com
Mon Jul 22 22:12:52 CEST 2013


On 2013-07-22 19:47:33 +0000, Peter Otten said:

> Chris Hinsley wrote:
> 
>> On 2013-07-22 18:36:41 +0000, Chris Hinsley said:
>> 
>>> Folks, I have this decorator:
>>> 
>>> def memoize(maxsize):
>>> def _memoize(func):
>>> lru_cache = {}
>>> lru_list = []
>> 
>> Other clues, I use it on a recursive function:
>> 
>> @memoize(64)
>> def next_move(board, colour, alpha, beta, ply):
>> if ply <= 0:
>> return evaluate(board) * colour
>> for new_board in all_moves(board[:], colour):
>> score = -next_move(new_board, -colour, -beta, -alpha, ply - 1)
>> if score >= beta:
>> return score
>> if score > alpha:
>> alpha = score
>> return alpha
>> 
>> And I notice I don't get the strange problem on a non-recursive
>> function ! Or at least I don't seam to.
> 
> That's indeed the problem:
> 
>> if len(lru_list) >= maxsize:
>> del(lru_cache[lru_list[0]])
>> del(lru_list[0])
>> ret = func(*args, **kwargs)
>> lru_cache[key] = ret
>> lru_list.append(key)
> 
> You delete a cached item, then call the original function which causes calls
> of the decorated function. This causes a length check which sees the already
> reduced length and decides that the cache is not yet full.
> 
> If you remove the oldest item after calling the original function you should
> be OK.

Ah ! Thank you kindly sir !

Chris




More information about the Python-list mailing list