gpt4 book ai didi

python - 实习不可变对象(immutable对象)

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:02 25 4
gpt4 key购买 nike

我有一个程序,其对象为以下形式

class MyObj(object):
def __init__(self, a, b):
self.__a = a
self.__b = b
self.cache = very_expensive_computation(a, b)

其中 a,b 是不可变的,可能的参数空间 a,b 非常小。这些对象在程序执行期间不断创建并超出范围,因此毫不奇怪,为相同的值 a,b 重新计算 self.cache 花费了大量时间.由于 very_expensive_computation 非常昂贵,似乎最好避免垃圾收集这些项目,并尽可能让构造函数返回对已存在对象的引用,有点像字符串实习。

对我来说最明显的方法似乎是向类中添加一个字典并覆盖 __new____init__ 以便它们检查字典并返回已经存在的如果可能的话,但同时这感觉有点不令人满意,因为它必须分别对每个类进行,并且因为在 __init__ 中检测你是否是一个真正的新对象可能会非常 hacky。

还有什么建议吗?

最佳答案

我会记住 very_expensive_computation 将结果存储在 LRU 缓存中以保证所用内存量的上限:

_very_expensive_computation_cache = RecentlyUsedContainer(100)

def cached_very_expensive_computation(a, b):
if (a, b) not in _very_expensive_computation_cache:
_very_expensive_computation_cache[(a, b)] = very_expensive_computation(a, b)
return _very_expensive_computation_cache[(a, b)]

RecentlyUsedContainer 可能是这个:https://github.com/shazow/unstdlib.py/blob/master/unstdlib/standard/collections_.py#L12

您还可以使用装饰器简化代码:

from unstdlib.standard.functools_ import memoized

@memoized(cache=RecentlyUsedContainer(100))
def cached_very_expensive_comptuation(a, b):
return very_expensive_computation(a, b)

参见:https://github.com/shazow/unstdlib.py/blob/master/unstdlib/standard/functools_.py#L59

我更喜欢将函数的内存版本与“真实”版本分开,以便调用者可以明确地看到他们可以获得缓存的结果,并且可以使测试更容易。不过,这主要是个人偏好。

编辑:正如评论中所指出的,Python 3 附带functools.lru_cache。 .

关于python - 实习不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38214721/

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