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

2024-06-06 22:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码片段中,如何避免在过程Get_maskGet_K_Shell_Te等中计算以下numpy变量maskzbarterorvol?这些变量是大型数组,我必须再定义至少六个重用它们的过程。看起来我做的不是一个好主意,而且很慢。你知道吗

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

Tags: selfdatagetreturnrodefnpmask
1条回答
网友
1楼 · 发布于 2024-06-06 22:39:56

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.something的形式访问它的所有实例变量,这正是您在不调用对象self时访问实例变量(和方法)的方式。如果您在一个方法中设置了一个实例变量,那么您只需在另一个方法中访问它(例如self.mask),无需返回它。如果您从一个方法返回了一些东西,很可能它不值得存储为实例变量,比如self.mask。)

相关问题 更多 >