quand python supprimer les variables?
Je sais que python dispose d'un dispositif de garbage collector et il devrait donc supprimer automatiquement les variables quand il n'y a plus de référence.
Mon impression est que cela ne se produit pas pour les variables locales (à l'intérieur d'une fonction).
def funz(z):
x = f(z) # x is a np.array and contains a lot of data
x0 = x[0]
y = f(z + 1) # y is a np.array and contains a lot of data
y0 = y[0]
# is x still available here ?
return y[0], x[0]
est del x la bonne façon d'économiser de la mémoire ?
def funz(z):
x = f(z) # x is a np.array and contains a lot of data
x0 = x[0]
del x
y = f(z + 1) # y is a np.array and contains a lot of data
y0 = y[0]
return y[0], x[0]
EDIT: j'ai édité mon exemple, qu'il est plus semblable à mon problème réel.
Dans mon vrai problème, x et y ne sont pas de liste de la classe mais qui contient différents à long np.tableau
EDIT: je suis en mesure d'exécuter le code:
x = f(z)
x[0]
print(x0)
y = f(z + 1)
y0 = [0]
print( y0)
j'ai l'impression que cela n'arrive pas pour les variables locales (à l'intérieur d'une fonction). Ce qui vous a donné cette impression? Les noms locaux sont nettoyés lorsque la fonction se termine; les objets référencés sont supprimés lorsque leur nombre référence tombe à 0 comme n'importe où ailleurs en Python.
J'ai une fonction qui s'exécutent en conséquence, certains indépendants des scripts. Je reçois une erreur de mémoire insuffisante. Je sais que j'ai été en mesure d'exécuter ces scripts de façon indépendante
lorsque la fonction exécute les scripts, comment allez-vous? Sont-ils en cours d'exécution comme des processus distincts ou sous forme de modules?
l'OP peut être troublé par le fait que "champ d'application" en python est différent de "champ d'application" dans de nombreuses autres langues. Par exemple, un
J'ai une fonction qui s'exécutent en conséquence, certains indépendants des scripts. Je reçois une erreur de mémoire insuffisante. Je sais que j'ai été en mesure d'exécuter ces scripts de façon indépendante
lorsque la fonction exécute les scripts, comment allez-vous? Sont-ils en cours d'exécution comme des processus distincts ou sous forme de modules?
l'OP peut être troublé par le fait que "champ d'application" en python est différent de "champ d'application" dans de nombreuses autres langues. Par exemple, un
for
boucle ne permet pas de définir un nouveau champ d'application et ses variables sont toujours en vie après la dernière itération.OriginalL'auteur Donbeo | 2014-08-13
Vous devez vous connecter pour publier un commentaire.
Implémentations utilisent le comptage de référence pour déterminer si une variable doit être supprimé.
Après la variable est hors de portée (comme dans votre exemple) si il n'y a pas les références restantes, puis la mémoire sera libérée.
De côté à partir du dictionnaire des clés et des éléments dans les listes, il y a généralement très peu de raison de supprimer manuellement les variables en Python.
Si, comme il est dit dans les réponses à cette question, à l'aide de del peut être utile pour montrer l'intention.
Merci, édité - je ne savais pas cela.
OriginalL'auteur Flau
Il est important de garder deux concepts distincts: les noms et les valeurs. Une variable en Python est un nom faisant référence à une valeur. Les noms ont un champ d'application: lorsque vous définissez une variable locale (par l'affectation d'une valeur à un nom), la variable du champ d'application est la fonction actuelle. Lorsque la fonction retourne une valeur, la variable s'en va. Mais cela ne signifie pas que la valeur disparaît.
Les valeurs n'ont pas de portée: ils restent jusqu'à ce qu'il n'y a pas plus de noms se référant à eux. Vous pouvez créer une valeur dans une fonction, et le retour de la fonction, faire un nom en dehors de la fonction se référer à la valeur, et la valeur ne sera pas récupéré jusqu'à ce que le futur lorsque toutes les références ont disparu.
Plus de détail (y compris les photos!) c'est ici: Les faits et les Mythes à propos de Python Noms et les Valeurs.
OriginalL'auteur Ned Batchelder
Écrire des trucs que vous voulez effacer de la mémoire dans des fonctions séparées. Dans votre exemple, vous pouvez faire
Cela va provoquer une exception
OriginalL'auteur user1023380
Il dépend de la mise en œuvre et le type de la variable. Pour des objets simples comme ints il y a quelques optimisations. Dans Disponible, par exemple, un simple int va réutiliser le même mémoire, même après
del
a été utilisé. Vous ne pouvez pas compter sur cela, mais il n'illustrent que les choses sont plus complexes qu'elles ne le semblent.Rappelez-vous que lorsque vous
del
vous êtes à la suppression d'un nom, pas nécessairement un objet.Par exemple:
Serait plus précisément libellé comme:
del
va décrémenter le compteur de référence sur cet objet, mais même lorsqu'elle tombe à zéro, il n'est pas garanti d'être nettoyée tout moment bientôt.Vous suggère de regarder à le
gc
module pour une explication et d'inspiration. Puis réfléchir à nouveau.Si vous obtenez "out of memory", alors vous avez probablement un problème fondamental avec votre conception. Plus vous avez de chances de chargement trop de données en un seul coup (essayez d'utiliser des itérateurs?), ou peut-être que votre code doivent être structurées mieux.
Je viens de voir ton edit. Avez-vous besoin de l'ensemble de ce tableau dans la mémoire en même temps? Pourriez-vous utiliser un générateur?
Une autre alternative est d'utiliser une base de données comme SQLite ou peut-être un étagère
OriginalL'auteur cdarke