Я создал приложение с Enthought Traits, которое использует слишком много памяти. Я думаю, проблема вызвана уведомлениями об атрибутах:Использование памяти @on_trait_change vs _foo_changed()
Существует, по-видимому, фундаментальное различие в использовании памяти событий, пойманных @on_trait_change, или с помощью специального соглашения об именах (например, _foo_changed()). Я сделал небольшой пример с двумя классами Foo и FooDecorator, которые, как я предполагал, показывают точно такое же поведение. Но они этого не делают!
from traits.api import *
class Foo(HasTraits):
a = List(Int)
def _a_changed(self):
pass
def _a_items_changed(self):
pass
class FooDecorator(HasTraits):
a = List(Int)
@on_trait_change('a[]')
def bar(self):
pass
if __name__ == '__main__':
n = 100000
c = FooDecorator
a = [c() for i in range(n)]
При выполнении этого сценария с с = Foo, диспетчер задач Windows, показывает использование памяти для всего процесса питон 70MB, который остается постоянным для повышения п. Для c = FooDecorator процесс python использует 450 Мбайт, увеличиваясь для более высоких n.
Не могли бы вы объяснить мне это поведение?
EDIT: Может быть, я должен перефразировать: зачем кому-то выбирать FooDecorator над Foo?
EDIT 2: Я просто удалил python (x, y) 2.7.9 и установил новейшую версию купола с характеристиками 4.5.0. Теперь 450 МБ стали 750 МБ.
EDIT 3: Скомпилированные черты-4.6.0.dev0-py2.7-win-amd64. Результат такой же, как в EDIT 2. Поэтому, несмотря на всю правдоподобие, https://github.com/enthought/traits/pull/248/files, по-видимому, не является причиной.
Относительно РЕДАКТИРОВАНИЯ 2: Исправлена ошибка с установкой двух недель назад. Официального релиза еще не было. Если вы хотите установить край кровотечения, клонируйте репозиторий git на https://github.com/enthought/traits и установите с помощью 'python setup.py install' – pberkes
Я могу подтвердить эту проблему. Кто-то открыл билет на GitHub для отслеживания проблемы: https://github.com/enthought/traits/issues/255 – pberkes