odd behavoiur seen
Chris Hinsley
chris.hinsley at gmail.com
Mon Jul 22 16:12:52 EDT 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