Je cherche la réponse exacte à cette question depuis quelques jours maintenant, mais je n'ai rien de bon. Je ne suis pas un débutant complet en programmation, mais pas encore au niveau intermédiaire.
Quand je suis dans le shell de Python, je tape: dir()
et je peux voir tous les noms de tous les objets dans la portée actuelle (bloc principal), il y en a 6:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Ensuite, lorsque je déclare une variable, par exemple x = 10
, elle ajoute automatiquement à cette liste d'objets sous le module intégré dir()
, et lorsque je tape à dir()
nouveau, cela montre maintenant:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
Il en va de même pour les fonctions, les classes, etc.
Comment supprimer tous ces nouveaux objets sans effacer le standard 6 qui était disponible au début?
J'ai lu ici à propos du "nettoyage de la mémoire", du "nettoyage de la console", qui efface tout le texte de la fenêtre d'invite de commande:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Mais tout cela n'a rien à voir avec ce que j'essaie de réaliser, cela ne nettoie pas tous les objets utilisés.
la source
del
fonction là-bas. Je commence à apprendre Python et je dois souvent expérimenter dans le shell, donc les noms de variables standard commex
ouy
sont souvent déjà utilisés et le redémarrage du shell prend encore 15 secondes à faire (j'ai un très, très vieux portable maintenant). Je voulais donc trouver un moyen de nettoyer plus rapidement la mémoire Python.del
n'est pas exactement une fonction, donc non(
et)
. C'est un mot-clé qui introduit une instruction del. Bien sûr, la façon dont il supprime réellement un objet peut impliquer des fonctions, mais c'est une autre histoire ...x
ouy
ne devraient pas être utilisés à moins que vous ne les utilisiez. Ou à moins que vous ne fassiez quelque chose de stupidefrom _somemodule_ import *
, alors vous obtiendrez toutes sortes de déchets encombrant l'endroit. :)Réponses:
Vous pouvez supprimer des noms individuels avec
del
:ou vous pouvez les supprimer de l'
globals()
objet:Ceci est juste un exemple de boucle; il supprime de manière défensive uniquement les noms qui ne commencent pas par un trait de soulignement, faisant l'hypothèse (non déraisonnable) que vous n'avez utilisé que des noms sans trait de soulignement au début dans votre interpréteur. Vous pouvez utiliser une liste de noms codée en dur à conserver à la place (liste blanche) si vous voulez vraiment être minutieux. Il n'y a pas de fonction intégrée pour faire l'effacement à votre place, à part simplement quitter et redémarrer l'interpréteur.
Les modules que vous avez importés (
import os
) resteront importés car ils sont référencés parsys.modules
; les importations suivantes réutiliseront l'objet de module déjà importé. Vous n'aurez tout simplement pas de référence à eux dans votre espace de noms global actuel.la source
startswith('_')
semble assez naïf. Si quelqu'un est assez intelligent pour écrire_foo=42
ou même__foo__=42
, comment pouvons-nous les supprimer? Existe-t-il un moyen d'obtenir les noms des propriétés de module standard par programme?dir(ModuleType())
, mais il ne fait que revenirdoc
etname
.Oui. Il existe un moyen simple de tout supprimer dans iPython. Dans la console iPython, tapez simplement:
Ensuite, le système vous demandera de confirmer. Appuyez sur y. Si vous ne souhaitez pas voir cette invite, tapez simplement:
Cela devrait fonctionner.
la source
Vous pouvez utiliser le garbage collector python:
la source
Si vous êtes dans un environnement interactif comme
Jupyter
ouipython
vous pourriez être intéressé par la suppression des variables indésirables si elles deviennent lourdes.Les commandes magiques
reset
etreset_selective
sont disponibles sur les sessions python interactives commeipython
etJupyter
1)
reset
in
et lesout
paramètres spécifient si vous souhaitez vider les caches d'entrée / sortie. L'historique du répertoire est vidé avec ledhist
paramètre.Un autre intéressant est
array
que ne supprime que les tableaux numpy:2) reset_selective
Exemple de réseau propre:
Source: http://ipython.readthedocs.io/en/stable/interactive/magics.html
la source
Cela a fonctionné pour moi.
Vous devez l'exécuter deux fois pour les globaux suivis des locaux
la source
En fait, python récupérera la mémoire qui n'est plus utilisée. C'est ce qu'on appelle le garbage collection qui est un processus automatique en python. Mais toujours si vous voulez le faire, vous pouvez le supprimer par
del variable_name
. Vous pouvez également le faire en affectant la variable àNone
La seule façon de vraiment récupérer de la mémoire à partir d'objets Python non référencés est via le garbage collector. Le mot-clé del dissocie simplement un nom d'un objet, mais l'objet doit toujours être récupéré. Vous pouvez forcer le garbage collector à s'exécuter à l'aide du module gc, mais il s'agit presque certainement d'une optimisation prématurée, mais elle comporte ses propres risques. L'utilisation
del
n'a aucun effet réel, puisque ces noms auraient été supprimés car ils étaient de toute façon hors de portée.la source
del
donc un effet réel ici.