1. Mécanisme de gestion de la mémoire de Python
pour les ingénieurs, Mécanisme de gestion de la mémoire est très important , qui est une bague qui ne peut pas être blessée. Si vous êtes un ingénieur Java, vous demanderez à JVM lorsque vous interviewez. Les ingénieurs C ++ nécessiteront également des fuites de mémoire et nous souhaitons en savoir plus sur la profondeur de Python, le mécanisme de gestion de la mémoire est également un anneau pire. Cependant, dans le mécanisme de gestion de la mémoire relativement simple de Python, nous n'avons pas besoin d'approfondir les détails, il suffit de créer une compréhension.
Le noyau du mécanisme de gestion de la mémoire Python est le numéro de référence et tout dans Python est un objet et un objet utilisé par référence.
Nous voyons le nom de la variable, mais le nom se tourne vers une partie de l'objet dans la mémoire. Cette relation s'appelle Référence dans Python et nous utilisons les objets par référence. Donc, dans cet article, le nombre de références est bien compris, c'est-à-dire que nous compterons tousLes deux chiffres l'un pour l'autre. Si le numéro de référence d'objet est 0, il n'a aucune référence pour le pointer, c'est-à-dire qu'il n'est pas utilisé, cette fois, Python regagnera cette mémoire.
Le principe de comptage de référence est simplement ces principes, mais nous sommes un peu profonds, de voir brièvement quelles scènes entraîneront des modifications des références d'objet. Les changements entre les références évidentes ne sont que deux, une croissance, une fois diminue, et ces deux scénarios n'ont que quatre cas. Jetons un coup d'œil à la situation:
Tout d'abord est l'initialisation, la plus simple consiste à attribuer une variable pour une variable avec attribuer . Par exemple:
n = 123
Il s'agit de l'opération d'initialisation la plus simple, bien que soit une constante aux États-Unis, mais également considérée comme un objet constant en dessous de Python. n est une référence à cela.
Le second cas est une référence à la livraison, le plus simple consiste à attribuer une autre variable à une autre variable.
m = n
VÍ: Nous fournissons n to m, sa nature est que nous avons créé une nouvelle référence, pointant vers la même mémoire. Si nous utilisons l'opération d'identification pour afficher ID M et N, nous verrons que leur identifiant est identique. Cela signifie, ils ne sont pas stockés dans deux valeurs identiques, mais montrant la même valeur. Il y a deux personnes nommées Wang Xiaoyi, mais Wang Xiaode a deux comptes différents .
Le troisième cas est en tant qu'élément enregistré dans la boîte à conteneurs, par exemple, il est stocké dansa = [1, 2,
, bien que nous ayons utilisé un conteneur, le conteneur ne fait pas Copiez l'un de ces objets ou uniquement Hébergement de références à ces objets
La situation finale consiste à transmettre une fonction de paramètre, en Python, toutes les sections sont référencées. C'est pourquoi nous voyons souvent pourquoi quelqu'un écrira du code:
Nous avons augmenté dans le cas de la quatre numéro de référenceC énumérés ci-dessus et pas difficile à traiter de la réduction de référence. En fait, fondamentalement
opération symétriquedef test(a): a.append(3) a = []test(a)print(a)
. Et l'opération correspondante de l'initialisation est détruite telle que l'objet que nous avons créé sera détruit par Del opérations, puis comptant le -1 et attribuer d'autres noms de variables à l'opposé. L'opération est écrasement , par exemple N = de nos qui sont N transformés les points nous avons maintenant attribué n à d'autres valeurs, puis numéros de référence de cet objet ont également été réduits.
del n
Étant donné que l'élément est stocké dans le conteneur, il apportera le numéro de référence, puis le même élément est retiré du conteneur et le numéro de référence est également réduit. Ceci est également bien compris, le plus simple est la méthode de suppression d'un appel de liste pour supprimer un élément:
n = 124
La réaction finale est la plage, ce qui est en tournant
de la plage Après cela, le numéro de référence de son bloc de mémoire correspondant est également réduit. Exemple: fonction d'appel CNous terminons, puis le numéro de référence correspond à ces variables lorsque les paramètres seront réduits.
a.remove
Si le nombre de références d'un objet est réduit à 0, la mémoire sera libérée lorsque Python est GC, c'est-à-dire que cet objet sera libéré. Supprimer, arrive d'espace.
Notez que le numéro de référence est réduit à 0 et la récupération de la mémoiren'est pas immédiatement mais il y a une période de temps. Sous le mécanisme Python, le recyclage de la mémoire ne sera effectué que dans certaines conditions. Dans le cas d'une grande quantité de richesse, elle n'est généralement pas faite en mémoire. Parce que Python arrêtera également le monde lors de l'exécution de GC (collection de déchets), il est suspendu toutes les autres tâches. Il s'agit donc d'une performance affectant uniquement si nécessaire.
Nous calculons une si grande intention d'introduire le mécanisme de mémoire en Python. En plus de ce contenu pour tout le monde, il est plus important d'introduire l'un d'entre nous couramment rencontré lorsque CHJ'ai développé. - ROUTE DE RÉFÉRENCE .
Deuxièmement, des références cycliques
Si vous connaissez la référence de Python, il est facile de comprendre la référence du cycle. Il est également très simple de dire que vous êtes cité par votre variable et une de mes variables citées.
Écrivez un code simple pour voir la référence circulatoire:
Si vous regardez l'arrêt, vous verrez le cycle référence A et B:
] C'estune expansion sans limites
car c'est une boucle infinie. Les boucles infinies ne font pas le problème du programme, et cela n'apportera pas trop de problèmes. Son problème n'est qu'un, basé sur des méthodes de comptage de référence, les références A et B ne seront jamais 0.
class Test: def __init__(self): passif __name__ == '__main__': a = Test() b = Test() a.t = b b.t = a
Cela signifie que, selon le principe des nombres de référence, Ces deux variables ne seront jamais recyclées ], évidemment déraisonnable. Bien que Python ait spécifiquement configuré un mécanisme pour résoudre des problèmes de boucle de référence, oncleJe ne sais pas quand il sera activé.
Ce problème est très populaire à Python, en particulier lorsque nous effectuons des structures de données. L'exemple le plus simple est le bouton de l'arborescence, ce qui signifie la boucle de référence. Étant donné que le nœud parent stocke tous les enfants, le nœud de l'enfant stockera également les informations du noeud parent. Après cela, cela forme une boucle de référence.
La troisième référence faible
de résoudre ce problème, un concept appelé référence faible fournie dans Python. La nature faible est également une référence, mais elle n'augmente pas le nombre de références d'objets. Cela signifie que cela ne peut garantir que l'objet qu'il est référencé ne sera pas détruit, tant qu'il n'est pas détruit, une référence faible peut renvoyer les résultats attendus.
Les faibles références n'ont pas besoin d'être développées par nous-mêmes, il s'agit d'un module intégré dans Python
SewRef. Il y a plusieurs façons du moduleEt il existe de nombreuses façons d'utiliser, mais nous ne sommes pas utilisés, et en général, le plus couramment utilisé est la réf. Avec la méthode REF dans la bibliothèque des Sewref, vous pouvez retourner une faible référence à l'objet. Nous venons toujours voir un exemple:
En fait, le code précédent, vient de changer simplement. On est notre nom à vérifier et méthode Str. L'autre est que nous avons changé le devoir directement pour utiliser Sewref. Cette fois, nous avons rompu à nouveau, si
n'a pas vu la boucle sans limites
class Node: def __init__(self, val, father): self.val = val self.father = father self.childs = []
: Ref renvoyé une méthode d'objets de référence, pas le sujet de l'objet principal. Nous voulons donc obtenir cet objet, vous devez appeler cela un appel de la fonction. Bien sûr, cela est très gênant et nous avons une meilleure façon d'utiliser
des commentaires d'actifs
. Avec des légendes d'actifs, nous pouvons emballer Sewref, ne vous sentez pas lorsque vous l'utilisez.Résumé
import weakrefclass Test: def __init__(self, name): self.name = name def __str__(self): return self.nameif __name__ == '__main__': a = Test('a') b = Test('b') a.t = weakref.ref(b) b.t = weakref.ref(a) print(a.t())
Documents TArrecias se référant et cyclique basé sur le mécanisme principal de Python. Si ce mécanisme ne comprend pas, il est facile de recevoir. Parce que la logique peut logique, il existe des erreurs inattendues. Cette fois, il est souvent difficile de surmonter la notation ou de le tester, c'est aussi une congestion de nos recherches. Il est facile de voir que le code a été très bien écrit, mais un code avancé ne peut toujours pas comprendre ou écrire, est essentiellement en raison du manque de compréhension et de sensibilisation aux fondamentaux. Le problème de référence cyclique est assez courant lorsque nous développons du code, en particulier lorsque l'arbre et la structure de données sont inclus. En raison de la relation de références cycliques, il est probable que l'arbre supprimé occupe toujours de l'espace et que la mémoire ne suffit pas. Il est nécessaire d'utiliser FedeRef pour le moment.