web-dev-qa-db-fra.com

Existe-t-il un moyen de supprimer les variables, fonctions, etc. créées de la mémoire de l'interpréteur?

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 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 de 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, il ajoute automatiquement à cette liste d'objets sous le module intégré dir(), et lorsque je tape dir() à nouveau, il affiche maintenant:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

Il en va de même pour les fonctions, les classes, etc.

Comment puis-je supprimer tous ces nouveaux objets sans effacer la norme 6 qui était disponible au début?

J'ai lu ici à propos de "nettoyage de la mémoire", "nettoyage de la console", qui efface tout le texte de la fenêtre Invite de commandes:

>>> 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.

88
funghorn

Vous pouvez supprimer des noms individuels avec del:

del x

ou vous pouvez les supprimer de l'objet globals():

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

Ceci est juste un exemple de boucle; de manière défensive, ne supprime que les noms qui ne commencent pas par un trait de soulignement, en partant du principe que vous avez uniquement utilisé des noms sans trait de soulignement au début de votre interprète. Vous pouvez utiliser une liste de noms codée en dur à conserver (liste blanche) si vous voulez vraiment être exhaustif. Il n’existe pas de fonction intégrée pour effectuer l’effacement pour vous, à part quitter et redémarrer l’interprète.

Les modules que vous avez importés (import os) resteront importés car ils sont référencés par sys.modules; les importations ultérieures réutiliseront l'objet module déjà importé. Vous n'aurez tout simplement pas de référence à ces noms dans votre espace de noms global actuel.

112
Martijn Pieters

Oui. Il existe un moyen simple de tout supprimer dans iPython. Dans la console iPython, tapez simplement:

%reset

Ensuite, le système vous demandera de confirmer. Appuyez sur y. Si vous ne voulez pas voir cette invite, tapez simplement:

%reset -f

Cela devrait marcher ..

50
EyesBear

Si vous êtes dans un environnement interactif comme Jupyter ou ipython, vous pourriez être intéressé par effacer les variables non désirées si elles deviennent lourdes .

Les commandes magiques reset et reset_selective sont disponibles sur les sessions interactives python telles que ipython et Jupyter

1) reset

reset Réinitialise l'espace de noms en supprimant tous les noms définis par l'utilisateur, s'ils sont appelés sans arguments.

in et les paramètres out spécifient si vous souhaitez vider les caches in/out. L'historique des répertoires est vidé avec le paramètre dhist.

reset in out

Un autre intéressant est array qui supprime uniquement les tableaux numpy:

reset array

2) reset_selective

Réinitialise l'espace de noms en supprimant les noms définis par l'utilisateur. L’historique des entrées/sorties est laissé au cas où vous en auriez besoin.

Exemple de tableau propre:

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

Source: http://ipython.readthedocs.io/fr/stable/interactive/magics.html

8
user1767754

Vous pouvez utiliser python garbage collector:

import gc
gc.collect()
8
Fardin

Cela a fonctionné pour moi.

Vous devez l'exécuter deux fois une fois pour les globals suivis par les locaux

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

for name in dir():
    if not name.startswith('_'):
        del locals()[name]
3
Viswa

En fait, python récupérera la mémoire qui n'est plus utilisée. C'est ce qu'on appelle ramasse-miettes qui est un processus automatique en python. Mais si vous voulez le faire, vous pouvez le supprimer par del variable_name. Vous pouvez également le faire en affectant la variable à None

a = 10
print a 

del a       
print a      ## throws an error here because it's been deleted already.

Le seul moyen de récupérer réellement de la mémoire à partir d'objets Python non référencés consiste à utiliser le ramasse-miettes. Le mot-clé del délie simplement le nom d'un objet, mais l'objet doit encore être nettoyé. Vous pouvez forcer Garbage Collector à s'exécuter à l'aide du module gc, mais il s'agit certainement d'une optimisation prématurée, mais elle comporte des risques propres. L'utilisation de del n'a pas d'effet réel, car ces noms auraient été supprimés car ils étaient de toute façon hors de portée.

3
d-coder