在下面的代码片段中,如何避免在过程Get_mask
、Get_K_Shell_Te
等中计算以下numpy变量mask
、zbar
、te
、ro
和rvol
?这些变量是大型数组,我必须再定义至少六个重用它们的过程。看起来我做的不是一个好主意,而且很慢。你知道吗
import numpy as np
# this computes various quantities related to the shell in a object oriented way
class Shell_Data:
def __init__(self, data):
self.data = data
def Get_mask(self):
zbar=self.data['z2a1']
y=self.data['y']*1000
mask= np.logical_and(zbar >= 16 ,zbar<= 19 )
return self.mask
def Get_Shell_Te(self):
self.mask =self.Get_mask()
te =self.data['te'][self.mask]
ro =self.data['ro'][self.mask]
rvol =self.data['rvol'][self.mask]
self.Shell_Te=np.sum(te*ro/rvol)/(np.sum(ro/rvol))
print "Shell Temperature= %0.3f eV" % (self.Shell_Te)
return self.Shell_Te
def Get_Shell_ro(self):
mask =self.Get_mask()
te =self.data['te'][mask]
ro =self.data['ro'][mask]
rvol =self.data['rvol'][mask]
radk =self.data['radk'][mask]
self.Shell_ro=np.sum(radk*ro/rvol)/np.sum(radk/rvol)
return self.Shell_ro
zbar
依赖于self.data
。如果您更新self.data
,您可能需要重新计算它。你知道吗如果可以使数据不可变,则可以计算这些值一次,例如在构造函数中。你知道吗
如果要避免在实际需要时才计算掩码数据,可以缓存该值,如下所示:
如果必须对
self.data
进行变异,则可以缓存计算出的数据,并仅在self.data
更改时重新计算。例如,如果您有一个setData()
方法,您可以重新计算其中的掩码,或者将self.cached_mask
设置为None
。你知道吗(另外,请再次阅读有关实例变量的内容。你知道吗
每个方法都接收名为
self
的参数,该参数是为其调用的对象的实例。您可以以self.
something的形式访问它的所有实例变量,这正是您在不调用对象self
时访问实例变量(和方法)的方式。如果您在一个方法中设置了一个实例变量,那么您只需在另一个方法中访问它(例如self.mask
),无需返回它。如果您从一个方法返回了一些东西,很可能它不值得存储为实例变量,比如self.mask
。)相关问题 更多 >
编程相关推荐