gpt4 book ai didi

python - 为类和静态方法配置lru_cache

转载 作者:太空狗 更新时间:2023-10-30 01:26:23 25 4
gpt4 key购买 nike

我正在尝试在 Python3 中使用 lru_cache 来加速对我们的 Salesforce 数据库的常见查询。以下是应该的相关代码

  • a) 将不可散列的参数转换为可散列的参数,以及
  • b) 为这些对象启用 LRU 缓存。

当我尝试这段代码时,缓存用于调用不带参数的函数,但它似乎不缓存带参数的函数调用。另外,我不确定如何为装饰函数订购装饰器。

请注意,我在这里使用了一个带有类和静态方法的类,因此我可以为 Resource 的不同子类覆盖 getget_all 方法>。

请解释我做错了什么或者可以做得更好。

from functools import lru_cache
from functools import wraps

class Resource(object):

def hash_dict(func):
"""Transform mutable dictionnary
Into immutable
Useful to be compatible with cache
"""
class HDict(dict):
def __hash__(self):
return hash(frozenset(self.items()))

@wraps(func)
def wrapped(*args, **kwargs):
args = tuple([HDict(arg) if isinstance(arg, dict) else arg for arg in args])
kwargs = {}
for k, v in kwargs.items():
if isinstance(v, dict):
kwargs[k] = HDict(v)
elif isinstance(v, list):
kwargs[k] = tuple(v)
else:
kwargs[k] = v
return func(*args, **kwargs)
return wrapped

@staticmethod
@hash_dict
@lru_cache
def get(cls, resource_id, lang='en', fields=None):
pass

@classmethod
@hash_dict
@lru_cache
def get_all(cls, lang='en', filters=None, fields=None):
pass

最佳答案

不需要额外的包。以下工作按预期进行:

import functools


class A:

@staticmethod
@functools.lru_cache(maxsize=None)
def build(value):
print('Creating', value)
return A()


assert A.build('a') is A.build('a')
assert A.build('b') is A.build('b')
assert A.build('b') is not A.build('a')

从 python 3.9 开始,您可以将 @functools.lru_cache(maxsize=None) 替换为 @functools.cache

关于python - 为类和静态方法配置lru_cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46544940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com