Estou procurando a resposta precisa para essa pergunta há alguns dias, mas não encontrei nada de bom. Não sou um novato completo em programação, mas ainda não estou no nível intermediário.
Quando estou no shell do Python, digito: dir()
e posso ver todos os nomes de todos os objetos no escopo atual (bloco principal), há 6 deles:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Então, quando estou declarando uma variável, por exemplo x = 10
, ela adiciona automaticamente a essa lista de objetos no módulo integrado e dir()
, quando eu digito dir()
novamente, ela mostra agora:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
O mesmo vale para funções, classes e assim por diante.
Como excluo todos esses novos objetos sem apagar o padrão 6 que estava disponível no início?
Eu li aqui sobre "limpeza de memória", "limpeza do console", que apaga todo o texto da janela do prompt de comando:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Mas tudo isso não tem nada a ver com o que estou tentando alcançar, não limpa todos os objetos usados.
fonte
del
função lá fora. Estou começando a aprender Python e frequentemente tenho que experimentar no shell, então nomes de variáveis padrão comox
ouy
muitas vezes já estão em uso e reiniciar o shell leva mais 15 segundos para fazer (eu tenho um laptop muito, muito antigo agora). Então, eu queria encontrar uma maneira de limpar a memória do Python mais rápido.del
não é exatamente uma função, portanto, não(
e)
. É uma palavra-chave que introduz uma instrução del. Claro, como ele realmente exclui um objeto pode envolver funções, mas isso é outra história ...x
ouy
não devem ser usados, a menos que você os esteja usando. Ou a menos que você faça algo bobo comofrom _somemodule_ import *
, então você terá todo tipo de lixo bagunçando o lugar. :)Respostas:
Você pode excluir nomes individuais com
del
:ou você pode removê-los do
globals()
objeto:Este é apenas um exemplo de loop; ele apaga defensivamente apenas nomes que não começam com sublinhado, assumindo (não sem razão) que você usou apenas nomes sem sublinhado no início do seu interpretador. Em vez disso, você poderia usar uma lista codificada de nomes para manter (lista de permissões) se realmente quisesse ser minucioso. Não há nenhuma função embutida para fazer a limpeza para você, a não ser apenas sair e reiniciar o interpretador.
Os módulos que você importou (
import os
) permanecerão importados porque são referenciados porsys.modules
; as importações subsequentes reutilizarão o objeto de módulo já importado. Você simplesmente não terá uma referência a eles em seu namespace global atual.fonte
startswith('_')
parece bastante ingênuo. Se alguém é inteligente o suficiente para escrever_foo=42
ou até mesmo__foo__=42
, como podemos excluí-los? Existe uma maneira de obter nomes de propriedades de módulo padrão programaticamente?dir(ModuleType())
, mas ele só retornadoc
ename
.Sim. Existe uma maneira simples de remover tudo no iPython. No console do iPython, basta digitar:
Então, o sistema irá pedir para você confirmar. Pressione y. Se você não quiser ver este prompt, basta digitar:
Isso deve funcionar ..
fonte
Você pode usar o coletor de lixo Python:
fonte
Se você está em um ambiente interativo como
Jupyter
ouipython
pode estar interessado em limpar os variáveis indesejados, se eles estiverem ficando pesados.A magia-comandos
reset
ereset_selective
é vailable em sessões python interativos, comoipython
eJupyter
1)
reset
in
e osout
parâmetros especificam se você deseja liberar os caches de entrada / saída. O histórico do diretório é limpo com odhist
parâmetro.Outro interessante é
array
que remove apenas Arrays numpy:2) reset_selective
Exemplo de matriz limpa:
Fonte: http://ipython.readthedocs.io/en/stable/interactive/magics.html
fonte
Isso funcionou para mim.
Você precisa executá-lo duas vezes uma vez para globais seguidos por locais
fonte
Na verdade, o python irá recuperar a memória que não está mais em uso. Isso é chamado de coleta de lixo, que é um processo automático em python. Mesmo assim, se você quiser fazer isso, pode excluí-lo por
del variable_name
. Você também pode fazer isso atribuindo a variável aNone
A única maneira de realmente recuperar a memória de objetos Python não referenciados é por meio do coletor de lixo. A palavra-chave del simplesmente desassocia um nome de um objeto, mas o objeto ainda precisa ser coletado como lixo. Você pode forçar o coletor de lixo a ser executado usando o módulo gc, mas isso é quase certamente uma otimização prematura, mas tem seus próprios riscos. Usar
del
não tem efeito real, pois esses nomes teriam sido excluídos ao sair do escopo de qualquer maneira.fonte
del
, tem um efeito real aqui.