Нет ничего плохого в задействованном методе init, особенно если вы пытаетесь не следовать стилю RAII, где конструирование объекта является инициализацией, что в целом является хорошей практикой. Таким образом, вы знаете, что объект действителен при строительстве, если это важно, в отличие от потенциально дорогостоящих операций, выполняемых позже, когда вы не ожидаете, что они будут дорогими.
Идея засолки хороша, однако я бы предложил что вы делаете mydict
переменную класса, если она подходит для совместного использования между инициализациями или она выпадает из области видимости после вызова init каждый раз, и mydict.p
не меняется. Единственное изменение, которое я могу сделать здесь, - это сделать инициализацию самой себя.therattr функцией. и измените структуру так, чтобы вы всегда делали один и тот же последний кусок
#snippet in your init
if myclass.mydict.empty() :
## load from the pickle so its shared for all class instantiations OR perhaps pull this out and make it part of class's init. otherwise every construction is reloading the pickle which could be as costly or more costly then your calculation itself. (File IO is slow)
do_dump = false # track whether I make changes that require a pickle dump update
if self.id !not in mydict:
mydict[self.id] = intensecomputation(id) # calc and memoize at once
do_dump = true;
pass
# now this is universal
self.otherattr = mydict[self.id]
#other stuff... which might also need to be pickled
#before end
#re-pickle if important; ensuring to do so potentially via a try catch finally wrapper.
Другая упомянутая возможность - использовать декоратор вокруг геттера для члена otherattr, который возвращает или вызывает и запоминает результат там, когда и если его используемый. выгода действительно сводится к тому, как используются данные. если вы выполняете кучу пакетной обработки позже со многими экземплярами myclass
в каком-то конвейере, это будет работать намного лучше, если значения будут готовы, если можно так выразиться, к go, поэтому кеш инструкций для вычисления любого конвейера, который у вас есть, может оставайтесь горячими, в отличие от прогнозирования пропущенных ветвлений каждые несколько раз, когда приходится прерывать конвейер и вычислять это значение.