Подтвердить что ты не робот

Вывод Python del

Вызов del для переменной в Python. Это освобождает выделенную память сразу или все еще ждет сбора сборщика мусора? Как и в java, явное вызов del не влияет на освобождение памяти.

4b9b3361

Ответ 1

Операция del не возвращает память. Он удаляет ссылку, которая уменьшает счетчик ссылок на значение. Если счетчик равен нулю, память может быть восстановлена. CPython немедленно восстановит память, нет необходимости ждать запуска сборщика мусора.

Фактически сборщик мусора нужен только для восстановления циклических структур.

Как говорит в своем комментарии Waleed Khan, управление памятью Python просто работает, вам не о чем беспокоиться.

Ответ 2

"Удаление имени удаляет привязку этого имени из локального или глобального пространства имен". Не больше, не меньше. Он ничего не делает для объекта, на которое указано имя, за исключением уменьшения его refcount, и если refcount не равен нулю, объект не будет собран даже при запуске GC.

Ответ 3

Кроме того, оператор del выглядит немного быстрее, чем присваивает None (аналогично стилю Java , присваивая null переменной освободите его память...).

Для сравнения:

import time, math

def measure_del():
        start = time.time()
        for i in range(0,int(math.pow(10,8))):
                    a = "123"
                    del a # <--- !!!
        end = time.time()
        print(end-start)

def measure_none():
        start = time.time()
        for i in range(0,int(math.pow(10,8))):
                    a = "123"
                    a = None # <--- !!!
        end = time.time()
        print(end-start)

приводит к (работает в idle3.4):

>>> measure_del()
3.9930295944213867
>>> measure_del()
3.7402305603027344
>>> measure_del()
3.8423104286193848
>>> measure_del()
3.753770351409912
>>> measure_del()
3.7772741317749023
>>> measure_del()
3.815058946609497

>>> measure_none()
4.052351236343384
>>> measure_none()
4.130320072174072
>>> measure_none()
4.082390069961548
>>> measure_none()
4.100180625915527
>>> measure_none()
4.071730375289917
>>> measure_none()
4.136169672012329