Изменчивый Python против неизменного использования памяти словаря - PullRequest
0 голосов
/ 12 сентября 2018

У меня возникли проблемы с вычислением, так как getizeof () Python не возвращает потребление памяти объектами, на которые ссылается словарь.

Если бы у меня было несколько функций, которые можно было бы вызывать в зависимости от заданного ввода:

def foo(x):
    mapping = {'a':func1,
               'b':func1,
               'c':func2,
               'd':func2,
               'e':func2,
               'f':func3,
               ...etc.}

    return mapping[x]()

и некоторые из входов привели к тому, что одна и та же функция вызывается, хранит ли несколько копий (или это ссылки?) Функции, что приведет к увеличению объема памяти?

Я пытаюсь определить, будет ли более эффективным использование памяти для создания промежуточного словаря, в котором хранится только одна копия функции:

functions = {0:func1,
             1:func2,
             2:func3,
             ...etc.}

и замените все значения функций в «отображении» соответствующим целым числом для экономии места. Я немного осведомлен о том, как изменяемые и неизменяемые объекты работают в Python, и мой первоначальный вывод заключается в том, что все значения, которые ссылаются на одну и ту же функцию, не приводят к тому, что большее количество копий функции занимает память. Это правильно?

В несколько связанном вопросе, если бы я должен был распечатать идентификатор объекта, используя id (), все ли объекты с одинаковым идентификатором ссылаются на одно и то же место в памяти (и, следовательно, не занимают больше памяти в словаре )

1 Ответ

0 голосов
/ 12 сентября 2018

Значения в Python dicts всегда являются ссылками.Там нет необходимости для промежуточного диктата.id (в CPython) получает число, основанное на адресе памяти объекта.Если объект получает мусор, тогда другой объект может получить этот идентификатор, но в любой момент времени идентификатор уникален для одного объекта.

Можно генерировать несколько функциональных объектов из одного и того же исходного кода, но с разнымиданные лексического замыкания.Закрывающие ячейки должны занимать память.


Ранняя оптимизация - корень зла.Не беспокойтесь о таких деталях, пока они не станут важными для вашей программы, обычно если они работают на ограниченном оборудовании или когда используется огромное количество объектов.(См. Также, __slots__.)

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