[Python-Dev] [Python-checkins] cpython: Issue 13227: Option to make the lru_cache() type specific (suggested by Andrew (original) (raw)

Nick Coghlan ncoghlan at gmail.com
Sat Oct 22 01:31:53 CEST 2011


On Fri, Oct 21, 2011 at 1:57 AM, raymond.hettinger <python-checkins at python.org> wrote:

+   If typed is set to True, function arguments of different types will be +   cached separately.  For example, f(3) and f(3.0) will be treated +   as distinct calls with distinct results.

I've been pondering this one a bit since reviewing it on the tracker, and I'm wondering if we have the default behaviour the wrong way around.

For "typed=True":

For "typed=False" (current default):

I only just realised this morning that the existing (untyped) caching behaviour can give answers that are numerically wrong, not just of the wrong type. This becomes clear once we use division as our test operation rather than multiplication and bring Decimal into the mix:

from functools import lrucache @lrucache() ... def divide(x, y): ... return x / y ... from decimal import Decimal 10 / 9 1.1111111111111112 Decimal(10) / Decimal(9) Decimal('1.111111111111111111111111111') divide(10, 9) 1.1111111111111112 divide(Decimal(10), Decimal(9)) 1.1111111111111112

At the very least, I think lru_cache should default to typed behaviour in 3.3, with people being able to explicitly switch it off as a cache optimisation technique when they know it doesn't matter. You could even make the case that making the cache type aware under the hood in 3.2 would be a bug fix, and the only new feature in 3.3 would be the ability to switch off the type awareness to save memory.

Regards, Nick.

-- Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-Dev mailing list