He estado buscando la respuesta precisa a esta pregunta durante un par de días, pero no tengo nada bueno. No soy un principiante absoluto en programación, pero aún ni siquiera en el nivel intermedio.
Cuando estoy en el shell de Python, escribo: dir()
y puedo ver todos los nombres de todos los objetos en el alcance actual (bloque principal), hay 6 de ellos:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Luego, cuando declaro una variable, por ejemplo x = 10
, se agrega automáticamente a esa lista de objetos en el módulo incorporado dir()
, y cuando vuelvo a escribir dir()
, se muestra ahora:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
Lo mismo ocurre con las funciones, clases, etc.
¿Cómo elimino todos esos objetos nuevos sin borrar el estándar 6 que estaba disponible al principio?
He leído aquí sobre "limpieza de memoria", "limpieza de la consola", que borra todo el texto de la ventana del símbolo del sistema:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Pero todo esto no tiene nada que ver con lo que estoy tratando de lograr, no limpia todos los objetos usados.
fuente
del
función ahí fuera. Estoy comenzando a aprender Python y, a menudo, tengo que experimentar en el shell, por lo que los nombres de variables estándar comox
o ay
menudo ya están en uso y reiniciar el shell me lleva otros 15 segundos (ahora tengo una computadora portátil muy, muy vieja). Así que quería encontrar una forma de limpiar la memoria de Python más rápido.del
no es exactamente una función, por lo tanto, no(
y)
. Es una palabra clave que introduce una declaración del. Por supuesto, la forma en que realmente elimina un objeto puede involucrar funciones, pero esa es otra historia ...x
oy
no deberían estar en uso a menos que los esté usando. O a menos que hagas algo tonto comofrom _somemodule_ import *
, entonces tendrás todo tipo de basura abarrotando el lugar. :)Respuestas:
Puede eliminar nombres individuales con
del
:o puede eliminarlos del
globals()
objeto:Este es solo un bucle de ejemplo; De manera defensiva, solo elimina los nombres que no comienzan con un guión bajo, asumiendo (no sin razón) que solo usó nombres sin un guión bajo al principio en su intérprete. En su lugar, podría usar una lista codificada de nombres (lista blanca) si realmente quisiera ser minucioso. No hay una función incorporada para hacer la limpieza por usted, aparte de salir y reiniciar el intérprete.
Los módulos que ha importado (
import os
) permanecerán importados porque son referenciados porsys.modules
; las importaciones posteriores reutilizarán el objeto de módulo ya importado. Simplemente no tendrá una referencia a ellos en su espacio de nombres global actual.fuente
startswith('_')
parece bastante ingenuo. Si alguien es lo suficientemente inteligente como para escribir_foo=42
o incluso__foo__=42
, ¿cómo podemos eliminarlos? ¿Hay alguna forma de obtener los nombres de las propiedades del módulo estándar mediante programación?dir(ModuleType())
, pero solo vuelvedoc
yname
.Si. Hay una forma sencilla de eliminar todo en iPython. En la consola iPython, simplemente escriba:
Entonces el sistema le pedirá que confirme. Presione y. Si no desea ver este mensaje, simplemente escriba:
Esto debería funcionar..
fuente
Puede usar el recolector de basura de Python:
fuente
Si se encuentra en un entorno interactivo como,
Jupyter
oipython
podría estar interesado en eliminar las var no deseadas si se están volviendo pesadas.Los comandos mágicos
reset
yreset_selective
está disponible en sesiones interactivas de Python comoipython
yJupyter
1)
reset
in
y losout
parámetros especifican si desea vaciar los cachés de entrada / salida. El historial del directorio se vacía con eldhist
parámetro.Otro interesante es
array
que solo elimina numpy Arrays:2) reset_selective
Ejemplo de matriz limpia:
Fuente: http://ipython.readthedocs.io/en/stable/interactive/magics.html
fuente
Esto funcionó para mí.
Debe ejecutarlo dos veces una vez para globales seguidos por locales
fuente
En realidad, Python recuperará la memoria que ya no está en uso. Esto se llama recolección de basura, que es un proceso automático en Python. Pero aún así, si quieres hacerlo, puedes eliminarlo mediante
del variable_name
. También puedes hacerlo asignando la variable aNone
La única forma de recuperar la memoria de los objetos Python sin referencia es a través del recolector de basura. La palabra clave del simplemente desvincula un nombre de un objeto, pero el objeto aún necesita ser recolectado como basura. Puede forzar la ejecución del recolector de basura utilizando el módulo gc, pero es casi seguro que se trata de una optimización prematura, pero tiene sus propios riesgos. El uso
del
no tiene ningún efecto real, ya que esos nombres se habrían eliminado ya que salieron del alcance de todos modos.fuente
del
no tenga un efecto real aquí.