如何避免在此python类中重新计算变量?

时间:2017-04-25 17:13:11

标签: python numpy

在下面的代码段中,如何避免在过程中计算以下numpy变量import json line = '[' + line + ']' mylist = json.loads(line) print(mylist[3][0]) maskzbartero { {1}},rvol等?这些变量是大型数组,我必须至少定义六个重用它们的过程。看起来我正在做的事情不是一个好主意而且很慢。

Get_mask

1 个答案:

答案 0 :(得分:0)

zbar取决于self.data。如果您更新self.data,则可能需要重新计算它。

如果您可以使数据不可变,则可以计算一次这些值,例如在构造函数中。

如果您想在实际需要之前避免计算掩码数据,可以缓存该值,如下所示:

class Shell_Data(...):

   def __init__(self,...):
     self.cached_mask = None
     ...

   # @property makes an access to self.mask
   # to actually return the result of a call to self.mask()
   @property
   def mask(self):
     if self.cached_mask is None:  # Not yet calculated.
       self.cached_mask = self.computeMask()
     return self.cached_mask

   def computeMask(self):
     zbar = ...
     ...
     return np.logical_and(...)

   def someComputation(self):
     # The first access to self.mask will compute it.
     te = self.data['te'][self.mask]
     # The second access will just reuse the same result. 
     ro = self.data['ro'][self.mask]
     ...

如果必须改变self.data,则可以缓存计算数据,并仅在self.data更改时重新计算。例如。如果您使用setData()方法,则可以重新计算其中的掩码,或者只需将self.cached_mask设置为None

(另外,再次阅读实例变量。

每个方法都接收名为self的参数,该参数是为其调用的对象的实例。您可以将所有实例变量作为self. 某些访问,这与您在未调用对象self时访问实例变量(和方法)的方式完全相同。如果在一个方法中设置实例变量,则可以只访问另一个方法(例如self.mask),无需返回它。如果从方法中返回某些内容,则可能不值得将其存储为实例变量,例如self.mask。)