Работает ли сборщик мусора Python по-другому с одним именем переменной подчеркивания _, и действительно ли это переменная "выбрасывания"? - PullRequest
0 голосов
/ 03 августа 2020

Представьте себе гипотетическую ситуацию, когда функция возвращает два значения: огромный набор данных, который вам неинтересен, и небольшое резюме, которое вам нужно. Если ваш сценарий (не интерактивная оболочка) имеет код типа

_, the_answer = deep_thought.ask(the_ultimate_question)

, сборщик мусора будет обрабатывать _ с любым другим именем и освобождать память быстрее, чем с

mostly_harmless, the_answer = deep_thought.ask(the_ultimate_question)

при условии, что mostly_harmless никогда не будет использоваться. Сначала я предположил, что это не так, но после прочтения этого: python сборка мусора и _ подчеркивание в среде интерпретатора , я начал сомневаться. Я надеюсь, что кто-то здесь узнает ответ или найдет его быстрее, чем я.

Кроме того, для бонусных баллов, как он сравнивается по производительности с

the_answer = deep_thought.ask(the_ultimate_question)[1]

?

1 Ответ

0 голосов
/ 03 августа 2020

Примечание: следующее относится к CPython (стандартный интерпретатор)

Чтобы понять работу сборщика мусора, вы должны сначала понять, что такое name, что такое object и что счетчик ссылок на объект

Возьмите следующую функцию

def foo():
    _ = {}

Когда функция выполняется, локальный словарь функции и глобальные объекты, хранящиеся внутри CPython, выглядят примерно так этот. (Это чрезмерно упрощенное объяснение)

--------------------    ------------------------
| name | object_id |    | id | reference_count |
--------------------    ------------------------
| _    | 1         |    | 1  | 1               |

Когда функция завершена, словарь locals уничтожается, и у любых объектов, на которые есть ссылки, уменьшается их reference_count

                        ------------------------
                        | id | reference_count |
                        ------------------------
                        | 1  | 0               |

Сборщик мусора будет в конечном итоге удалите объект с идентификатором 1, поскольку он больше не имеет ссылок на него, имена ссылок (имена переменных) не имеют значения.

Переменная могла быть названа как угодно и не для сборщика мусора имеет значение только счетчик ссылок на объект

...