У меня есть структура объекта, в которой есть взаимные ссылки (конечный элемент, в котором результаты должны ссылаться на узлы и элементы, а узлы и элементы должны ссылаться на результаты).
Я использую Слабые ссылки, чтобы избежать установки постоянной ссылки l oop, которая предотвращает сборку мусора.
Однако во время профилирования я обнаружил, что очистка этих слабых ссылок на удивление дорогая - за исключением только минимума Сципи (производительность которого вполне понятна) .
Я увеличил производительность примерно на 35%, представив неиспользованные слабые ссылки как None:
Оригинал:
def clear_results(self):
self._results = lambda: None # Mimics weakref behaviour, but returns None
На 35% быстрее:
def clear_results(self):
self._results = None # Requires check in the public accessor of self._results
Это также уничтожение слабого, что, по-видимому, требует времени - создание слабого даже не входит в список профилирования.
Это не кажется интуитивно понятным разумно - я что-то упустил?