Я уже пару дней искал точный ответ на этот вопрос, но ничего хорошего не нашел. Я не совсем новичок в программировании, но даже не на среднем уровне.
Когда я нахожусь в оболочке Python, я печатаю: dir()
и я могу видеть все имена всех объектов в текущей области (основном блоке), их 6:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Затем, когда я, например x = 10
, объявляю переменную, она автоматически добавляется к этому списку объектов во встроенном модуле dir()
, а когда я dir()
снова набираю текст, теперь отображается:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
То же самое и с функциями, классами и т. Д.
Как мне удалить все эти новые объекты, не стирая стандартные 6, которые были доступны в начале?
Я читал здесь про «очистку памяти», «очистку консоли», которая стирает весь текст из окна командной строки:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Но все это не имеет ничего общего с тем, чего я пытаюсь достичь, это не очищает все используемые объекты.
del
функция. Я начинаю изучать Python, и мне часто приходится экспериментировать в оболочке, поэтому стандартные имена переменных, такие какx
илиy
часто уже используются, а перезапуск оболочки занимает еще 15 секунд (у меня сейчас очень, очень старый ноутбук). Поэтому я хотел найти способ быстрее очистить память Python.del
- это не совсем функция, поэтому нет(
и)
. Это ключевое слово вводит оператор del. Конечно, то, как он на самом деле удаляет объект, может включать функции, но это уже другая история ...x
илиy
не должны использоваться, если вы их не используете. Или, если вы не сделаете что-нибудь глупоеfrom _somemodule_ import *
, вы получите все виды мусора, захламляющего место. :)Ответы:
Вы можете удалить отдельные имена с помощью
del
:или вы можете удалить их с
globals()
объекта:Это просто примерный цикл; он в качестве защиты удаляет только имена, которые не начинаются с подчеркивания, делая (небезосновательно) предположение, что вы использовали только имена без подчеркивания в начале вашего интерпретатора. Вместо этого вы можете использовать жестко запрограммированный список имен (белый список), если вы действительно хотите быть внимательными. Нет встроенной функции, которая бы выполняла очистку за вас, кроме выхода и перезапуска интерпретатора.
Модули, которые вы импортировали (
import os
), останутся импортированными, потому что на них ссылаетсяsys.modules
; последующий импорт будет повторно использовать уже импортированный объект модуля. У вас просто не будет ссылки на них в вашем текущем глобальном пространстве имен.источник
startswith('_')
кажется довольно наивным. Если кто-то достаточно умен, чтобы писать_foo=42
или даже__foo__=42
, как мы можем их удалить? Есть ли способ получить имена стандартных свойств модуля программно?dir(ModuleType())
, но она только возвращаетсяdoc
иname
.Да. Есть простой способ удалить все в iPython. В консоли iPython просто введите:
Затем система попросит вас подтвердить. Нажмите y. Если вы не хотите видеть это приглашение, просто введите:
Это должно работать ..
источник
Вы можете использовать сборщик мусора Python:
источник
Если вы находитесь в интерактивной среде, например,
Jupyter
илиipython
вам может быть интересно удалить ненужные var, если они становятся тяжелыми.Магические команды
reset
иreset_selective
доступны в интерактивных сеансах Python, таких какipython
иJupyter
1)
reset
in
аout
параметры указывают, хотите ли вы очистить кеши ввода / вывода. История каталогов сбрасывается сdhist
параметром.Еще один интересный момент заключается в
array
том, что удаляет только массивы numpy:2) reset_selective
Пример чистого массива:
Источник: http://ipython.readthedocs.io/en/stable/interactive/magics.html
источник
Это сработало для меня.
Вам нужно запустить его дважды, один раз для глобальных, за которыми следуют локальные
источник
На самом деле python будет освобождать память, которая больше не используется. Это называется сборкой мусора, которая в Python является автоматическим процессом. Но все же, если вы хотите это сделать, вы можете удалить его с помощью
del variable_name
. Вы также можете сделать это, присвоив переменнойNone
Единственный способ по-настоящему освободить память от объектов Python, на которые нет ссылок, - это использовать сборщик мусора. Ключевое слово del просто отвязывает имя от объекта, но объект по-прежнему необходимо собрать мусором. Вы можете принудительно запустить сборщик мусора с помощью модуля gc, но это почти наверняка преждевременная оптимизация, но она имеет свои риски. Использование
del
не имеет реального эффекта, поскольку эти имена в любом случае были бы удалены, поскольку они вышли из области видимости.источник
del
что здесь есть реальный эффект.