klepto缓存中参数的不同容差

时间:2015-12-14 10:20:09

标签: python memoization klepto

我想为某个函数参数设置容差,但不为其他参数设置容差。 假设我有这样的函数:

def myFnc(input1,param0 = 0, param1 =1):
    return "input1:%s [params %s, %s]" %(input1, param0, param1)

这些是预期结果:

>>>> myFnc(0.1, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]'
>>>> myFnc(0.1, param0= 0.12, param1 = 1)
'input1:0.1 [params 0.12, 1]'
>>>> myFnc(0.12, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]' #the same as the first instruction

我尝试使用tol并忽略,但我没有得到我期望的结果:

>>>> from klepto import inf_cache
>>>> f=inf_cache(tol=0,ignore=("**"))(myFnc);
>>>> f(0.1, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]'
>>>> f(0.1, param0= 0.12, param1 = 1)
'input1:0.1 [params 0.1, 1]' #I wanted [params 0.12, 1] 
>>>> f(0.12, param0= 0.1, param1 = 1)
'input1:0.1 [params 0.1, 1]'

我正在使用从pip安装的klepto(klepto .__ version__ 0.1.1)。我可以更改密钥图吗?

1 个答案:

答案 0 :(得分:0)

我是klepto作者。这看起来像我预期的结果。您的第f=inf_cache(tol=0,ignore="**")(myFnc)行告诉我您希望舍入整数容差,并且您要忽略函数中的所有其他**kwds

但是,您的功能myFcn并未使用**kwds,因此我认为您的意思是ignore=('param0','param1')。当您使用ignore时,它已经习惯了"忽略"函数声明中的变量......不是函数调用。

当您忽略变量时,缓存会忽略变量。

>>> f = inf_cache(tol=0, ignore=('param0','param1'))(myFnc)
>>> f(.1, param0=.1, param1=1)
(0.1, 0.1, 1)
>>> f(.1, param0=.12, param1=1)
(0.1, 0.1, 1)
>>> f(.12, param0=.1, param1=1)
(0.1, 0.1, 1)

以上,只有' input1 (the first argument) is being cached… and it doesn't change with greater than tol = 0 . So, when you change param0 or param1` ...它不会使缓存无效,你仍然可以获得 - 缓存的值返回。

因此,无论您更改input1以外的任何内容,您仍将获得最初缓存的值。

>>> f(.1, param0=5.1, param1=1)
(0.1, 0.1, 1)
>>> f(.1, param0=5.1, param1=10)
(0.1, 0.1, 1)

但是,当我在int容差之外更改input1时,我们会有第二个缓存结果。

>>> f(5.1, param0=5.1, param1=10)
(5.1, 5.1, 10)

即使我使用**,最后两个参数仍然被忽略,因为忽略适用于函数规范而不是调用。

>>> f(5.1, **dict(param0=100, param1=100))
(5.1, 5.1, 10)

更改keymap根本不会更改结果。更改keymap的作用是更改缓存中用作密钥的内容。

>>> f.__cache__()
null_archive({5999492624188339149: (0.1, 0.1, 1), 58251017057462798: (5.1, 5.1, 10)}, cached=True)

您还可以看到它使用lookup而不是实际使用缓存来使用缓存值。

>>> f.lookup(5.1, 6, 10)
(5.1, 5.1, 10)
>>> f.lookup(4.1, 5.1, 10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mmckerns/lib/python2.7/site-packages/klepto-0.1.2.dev0-py2.7.egg/klepto/_cache.py", line 341, in lookup
    return cache[keymap(*_args, **_kwds)]
KeyError: -2002243791131618159