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

delfunció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 comoxo aymenudo 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.delno 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 ...xoyno 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=42o 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 vuelvedocyname.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,
Jupyteroipythonpodría estar interesado en eliminar las var no deseadas si se están volviendo pesadas.Los comandos mágicos
resetyreset_selectiveestá disponible en sesiones interactivas de Python comoipythonyJupyter1)
resetiny losoutparámetros especifican si desea vaciar los cachés de entrada / salida. El historial del directorio se vacía con eldhistparámetro.Otro interesante es
arrayque 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 aNoneLa ú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
delno tiene ningún efecto real, ya que esos nombres se habrían eliminado ya que salieron del alcance de todos modos.fuente
delno tenga un efecto real aquí.