Python klepto缓存中参数的不同容差
我想为某个函数参数设置容差,但不为其他参数设置容差。 假设我有这样一个函数:Python klepto缓存中参数的不同容差,python,memoization,klepto,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]' >>>&
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和ignore,但我没有得到我所期望的:
>>>> 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.\uuuuu0.1.1版)。我是否应该更改钥匙图?我是
klepot
的作者。对我来说,这些看起来像是预期的结果。您的行f=inf\u cache(tol=0,ignore=“**”(myFnc)
告诉我您希望在整数公差处舍入,并且您希望忽略函数中的所有附加**kwd
但是,您的函数myFcn
没有使用**kwds
,因此我假设您的意思是希望忽略=('param0','param1')
。使用ignore
时,它用于“忽略”函数声明中的变量,而不是函数调用
>>> f(5.1, **dict(param0=100, param1=100))
(5.1, 5.1, 10)
忽略变量时,忽略变量的是缓存
>>> 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(第一个参数)…并且它不会随着大于
tol=0而改变。因此,当您更改
param0或
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)
但是,当我更改input1
超出int公差时,我们会得到第二个缓存结果
>>> 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
>f.lookup(5.1,6,10)
(5.1, 5.1, 10)
>>>f.查阅(4.1、5.1、10)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mmckerns/lib/python2.7/site packages/klepot-0.1.2.dev0-py2.7.egg/klepot/_cache.py”,第341行,在查找中
返回缓存[keymap(*\u args,**\u kwds)]
键错误:-2002243791131618159
我是klepot
的作者。对我来说,这些看起来像是预期的结果。您的行f=inf\u cache(tol=0,ignore=“**”(myFnc)
告诉我您希望在整数公差处舍入,并且您希望忽略函数中的所有附加**kwd
但是,您的函数myFcn
没有使用**kwds
,因此我假设您的意思是希望忽略=('param0','param1')
。使用ignore
时,它用于“忽略”函数声明中的变量,而不是函数调用
>>> f(5.1, **dict(param0=100, param1=100))
(5.1, 5.1, 10)
忽略变量时,忽略变量的是缓存
>>> 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(第一个参数)…并且它不会随着大于
tol=0而改变。因此,当您更改
param0或
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)
但是,当我更改input1
超出int公差时,我们会得到第二个缓存结果
>>> 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
>f.lookup(5.1,6,10)
(5.1, 5.1, 10)
>>>f.查阅(4.1、5.1、10)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mmckerns/lib/python2.7/site packages/klepot-0.1.2.dev0-py2.7.egg/klepot/_cache.py”,第341行,在查找中
返回缓存[keymap(*\u args,**\u kwds)]
键错误:-2002243791131618159
感谢您对忽略机制的更清晰解释!但是,撇开对ignore关键字的误解不谈,在示例中是否有一种内置的方法来获取我的“预期结果”,或者我是否应该使用一个函数来处理第一个输入(如果需要,应用舍入),然后使用myFnc?我明白了,所以您希望应用舍入,即“ignore”用于标记不希望对其应用舍入的参数/关键字。对吗?klepot
中的语法是ignore
忽略缓存中的参数/关键字(而不是取整)。我想我已经在我的另一个软件包(mystic
,我相信)中编写了这样一个函数,但是您可能想尝试编写自己的。好的,谢谢!我想我会使用一个助手函数来检查输入。谢谢你对忽略机制的更清晰解释!但是,撇开对ignore关键字的误解不谈,在示例中是否有一种内置的方法来获取我的“预期结果”,或者我是否应该使用一个函数来处理第一个输入(如果需要,应用舍入),然后使用myFnc?我明白了,所以您希望应用舍入,即“ignore”用于标记不希望对其应用舍入的参数/关键字。对吗?klepot
中的语法是ignore
忽略缓存中的参数/关键字(而不是取整)。我想我已经在我的另一个软件包(mystic
,我相信)中编写了这样一个函数,但是您可能想尝试编写自己的。好的,谢谢!我想我会使用一个helper函数来检查输入。