У меня есть программа с объектом формыинтернируя неизменные объекты
class MyObj(object):
def __init__(self, a, b):
self.__a = a
self.__b = b
self.cache = very_expensive_computation(a, b)
a,b
, где неизменен и пространством возможных параметров a,b
очень малы. Эти объекты создаются и выходят за рамки постоянно во время выполнения программы, поэтому неудивительно много времени потрачено на пересчет self.cache
для тех же значений a,b
. Поскольку very_expensive_computation
стоит очень дорого, кажется, было бы лучше просто избегать сбора мусора этих элементов и, если возможно, конструктора возвращать ссылки на уже существующие объекты, вроде как интернирование строк.
Очевидный способ сделать это мне кажется, чтобы добавить словарь в класс и переопределить __new__
и __init__
так, что они проверяют словарь и возвращать уже существующие экземпляры, если это возможно, но в то же время это чувствует своего рода неудовлетворительно так как это нужно было бы сделать для каждого класса отдельно, и с момента обнаружения того, являетесь ли вы фактическим новым объектом в __init__
, вероятно, будет довольно хаки.
Любые другие предложения?
Я хотел бы рассмотреть только кэширование 'very_expensive_computation', или добавление метода класса, который может вернуть сохраненные экземпляры вместо того, чтобы' MyObj() 'вернуть старый экземпляров. Выполнение 'MyObj()' возвращенных сохраненных экземпляров может стать беспорядочным. – user2357112