我发现自己陷入了困境,我开发了一个类,然后创建了该类的一个实例。这些类通常会执行数据和统计操作,这些操作需要很长时间,有时需要 20 分钟。
我将继续开发我的类,并向其中添加其他方法。现在,如何使用新方法更新以前的类实例而不重新初始化该类的旧实例(在本例中需要 20 分钟)?
有一点点XY https://meta.stackexchange.com/a/66378/378077问题在这里。
你真正的困难似乎是“需要 20 分钟才能完成__init__
演员来完成。”
有几种方法可以摆脱这种困境。
- 花费许多分钟计算一个新实例,然后安排将其快速序列化到磁盘。如果反序列化花费的时间少于二十分钟,那么您就赢了!
- 使用一定程度的间接,因此具有如此多有趣行为的对象是轻量级的,消耗很少的内存。让它包含指向 RDBMS id、S3 存储桶、url 或文件名的指针。
- 将昂贵的对象存储在全局或等效对象中,例如@lru_cache https://docs.python.org/3/library/functools.html#functools.lru_cache,并让您更新/重新加载的类找到它。使用importlib.reload() https://docs.python.org/3/library/importlib.html#importlib.reload.
- 与序列化类似,提供廉价的 .copy() 并利用继承。
- 猴子补丁。
这是利用继承的一种方法
(复制不是必需的,但可以使其更清晰):
class FooBase:
...
# global variable for expensive computation
foo = FooBase()
class FooFeature(FooBase):
def __init__(self, foo):
...
def some_new_feature(self):
...
foo = FooFeature(foo.copy()) # This happens quickly.
这是猴子补丁的一种方法:
class Foo:
...
foo = Foo()
FooOriginal = Foo
# Now you edit in a brand new Foo feature and reload the class definition:
def new_feature(self):
...
FooOriginal.new_feature = Foo.new_feature
当猴子补丁时,
注意foo
持有对同一类对象的引用FooOriginal
成立。
重新加载后,Foo
成为一个全新的物体,
使用另一种方法。
最终的猴子补丁分配
使该方法可用FooOriginal
,
因此可用于foo
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)