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
--
http://mail.python.org/mailman/listinfo/python-list