Python объекты класса: как избежать повторных вычислений? - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу спросить ваши предложения о том, как создать класс Python, который наилучшим образом соответствует моим потребностям.

Предположим, я сначала ввел Python класс LatticeClass. В частности, LatticeClass поставляется с методом TheModel(), который может создать эрмитовую матрицу HH, как показано ниже:

obj = LatticeClass()
obj.a = 3.0
obj.b = -0.80
HH = obj.TheModel()

Теперь я хочу представить еще один Python класс LatticeProperty, который наследуется от LatticeClass. Этот класс будет вычислять собственные значения и собственные векторы HH, а также использовать их для вычисления чего-то еще. Например, вот код, который я написал:

class LatticeProperty(LatticeClass):
    def __init__(self):
        super().__init__()

    @property
    def spectrum(self):
        HH = self.TheModel()
        mat = HH.todense()
        print(mat.shape)
        val, vec = Lib.eig(mat)
        return val, vec

    def Method1(self):
        val, vec = self.spectrum
        total_energy = val.sum()
        return total_energy

Предположим, я сейчас напишу следующий код:

newobj = LatticeProperty()
newobj.a = 3.0
newobj.b = -0.80

Мне нужно следующее:

  1. Когда я звоню newobj.spectrum, я могу просто попросить систему дать мне собственные значения и собственные векторы без повторной диагонализации, если я не изменю параметры a и b.
  2. Когда я звоню newobj.Method1(), он должен дать мне окончательный ответ, используя сохраненные собственные значения и собственные векторы, без вызова диагонализации матрицы.

Однако в этот момент система выполняет матричную диагонализацию каждый раз, когда я называю newobj.spectrum. Что я должен сделать, чтобы решить эту проблему?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...