在python中用组合存储属性两次-内存效率低下吗?

问题描述

我有一个类似下面的类结构,

class binomial():

  def __init__(self,theta):
    self.theta = theta

class beta_binomial():
  def __init__(self,theta,beta):
    self.b = binomial(theta)
    self.theta = self.b.theta
    self.beta = beta

我喜欢这种结构,因为我可以使用以下内容直接访问thetabeta

bb = beta_binomial(np.array([0.5,0.5,0.3,0.3]),np.array([0.35,0.15,0.53,0.83]))
bb.theta,bb.beta

但是,我想知道这是否会导致内存效率低下,因为theta既是binomialbeta_binomial属性。换句话说,bb.thetabb.b.theta返回相同的内容。我知道Python做了一些聪明的事情来减少这样的低效率,但是我不确定它是否适用于此。如果theta一个非常大的数组(可以是),可能会很重要。

解决方法

theta作为实例属性存储,而不是将其作为属性。

class beta_binomial:
    def __init__(self,theta,beta):
        self.b = binomial(theta)
        self.beta = beta

    @property
    def theta(self):
        return self.b.theta

这会减少每个实例的内存,但会以稍慢的访问为代价。

,

否,除了可以忽略的重复引用开销(如果您有很多实例,它们可能会堆积起来)之外,这并不是内存不足的问题。可以使用id()函数来查看bb.thetabb.b.theta具有相同的内存地址。

bb = beta_binomial(np.array([0.5,0.5,0.3,0.3]),np.array([0.35,0.15,0.53,0.83]))
id(bb.theta) == id(bb.b.theta)

返回true

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...