我正在编写一个类,它有一些计算量大的方法和一些用户想要迭代调整并且独立于计算的参数。
实际用途是用于可视化,但这里有一个卡通示例:
class MyClass(object):
def __init__(self, x, name, mem=None):
self.x = x
self.name = name
if mem is not None:
self.square = mem.cache(self.square)
def square(self, x):
"""This is the 'computation heavy' method."""
return x ** 2
def report(self):
"""Use the results of the computation and a tweakable parameter."""
print "Here you go, %s" % self.name
return self.square(self.x)
x
基本思想是用户可能希望创建具有相同但不同name
参数的此类的许多实例。我想允许用户提供一个joblib.Memory
对象来缓存计算部分,这样他们就可以“报告”许多不同的名称,而无需每次都重新计算平方数组。
(这有点奇怪,我知道。用户需要为每个名称使用不同的类实例的原因是他们实际上将与看起来像这样的接口函数进行交互。
def myfunc(x, name, mem=None):
theclass = MyClass(x, name, mem)
theclass.report()
但让我们暂时忽略它)。
在joblib 文档之后,我正在square
使用该行缓存该函数self.square = mem.cache(self.square)
。问题是,因为self
对于不同的实例会有所不同,所以即使参数相同,每次都会重新计算数组。
我猜想处理这个问题的正确方法是将线路更改为
self.square = mem.cache(self.square, ignore=["self"])
但是,这种方法有什么缺点吗?有没有更好的方法来完成缓存?