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