使用 klepto 按函数名和参数缓存
use klepto to cache by function name and args
我正在尝试使用 klepto 作为缓存来散列 args 和函数名称,这可能吗?
例如所以使用 dir_cache 我可以
@inf_cache(cache=dir_archive(cached=False))
def func1(x, y):
return x + y
@inf_cache(cache=dir_archive(cached=False))
def func2(x, y):
return x - y
并且对 func1(1, 2) 和 func2(1, 2) 的两次调用都会在 dir_archive
中产生单独的键
我是不是漏了什么?
虽然可能不是一个完全可靠的解决方案,但这似乎在某种程度上可以满足您的需求。
>>> import klepto
>>> @klepto.inf_cache(cache=klepto.archives.dir_archive(cached=False))
... def func1(x, y, name='func1'):
... return x+y
...
>>> @klepto.inf_cache(cache=klepto.archives.dir_archive(cached=False))
... def func2(x, y, name='func2'):
... return x-y
...
>>>
>>> func1(1,2)
3
>>> func1(1,3)
4
>>> func2(2,4)
-2
>>> func2(1,2)
-1
>>> func1.__cache__()
dir_archive('memo', {-8532897055064740991: 4, -8532897055063328358: 3, -960590732667544693: -1, -3289964007849195004: -2}, cached=False)
>>>
>>> func1(1,2)
3
>>> func1(1,2)
3
>>> func2(1,2)
-1
>>>
>>> func1.__cache__() == func2.__cache__()
True
您会注意到 dir_archive
是相同的,而且这两个函数似乎都使用单独的缓存。一个问题是,您可以传入一个 'name'
来覆盖默认值,并且很容易把事情搞砸。我猜想如果需要,您可以使用另一个装饰器做一些更强大的事情,以防止用户更改 'name'
关键字。
我正在尝试使用 klepto 作为缓存来散列 args 和函数名称,这可能吗?
例如所以使用 dir_cache 我可以
@inf_cache(cache=dir_archive(cached=False))
def func1(x, y):
return x + y
@inf_cache(cache=dir_archive(cached=False))
def func2(x, y):
return x - y
并且对 func1(1, 2) 和 func2(1, 2) 的两次调用都会在 dir_archive
中产生单独的键我是不是漏了什么?
虽然可能不是一个完全可靠的解决方案,但这似乎在某种程度上可以满足您的需求。
>>> import klepto
>>> @klepto.inf_cache(cache=klepto.archives.dir_archive(cached=False))
... def func1(x, y, name='func1'):
... return x+y
...
>>> @klepto.inf_cache(cache=klepto.archives.dir_archive(cached=False))
... def func2(x, y, name='func2'):
... return x-y
...
>>>
>>> func1(1,2)
3
>>> func1(1,3)
4
>>> func2(2,4)
-2
>>> func2(1,2)
-1
>>> func1.__cache__()
dir_archive('memo', {-8532897055064740991: 4, -8532897055063328358: 3, -960590732667544693: -1, -3289964007849195004: -2}, cached=False)
>>>
>>> func1(1,2)
3
>>> func1(1,2)
3
>>> func2(1,2)
-1
>>>
>>> func1.__cache__() == func2.__cache__()
True
您会注意到 dir_archive
是相同的,而且这两个函数似乎都使用单独的缓存。一个问题是,您可以传入一个 'name'
来覆盖默认值,并且很容易把事情搞砸。我猜想如果需要,您可以使用另一个装饰器做一些更强大的事情,以防止用户更改 'name'
关键字。