Un mécanisme de collecte des ordures Python qui vous permet de quitter le travail plus tôt

Un nouveau pêcheur, Manon. 2021-11-25 18:49:20
canisme collecte des ordures python

La vie est courte.,On ne parle que du vent et de la lune,Parler du recyclage des ordures.

On dit que l'image ci - dessus est un mécanisme de collecte des ordures pour une langue...

 

On a écritCLangues、C++Nos amis le savent.,La nôtre.CIl n'y a pas de recyclage des ordures dans la langue.Répartition manuelle、Pour libérer la mémoire, il faut que nos programmeurs le fassent eux - mêmes.Peu importe.“Fuite de mémoire” Les pointeurs sauvages sont des maux de tête pour les développeurs.Alors...CDéveloppement linguistique le sujet le plus discuté est la gestion de la mémoire.Mais pour les autres langues avancées,Par exempleJava、C#、PythonLangues de haut niveau,Un mécanisme de collecte des ordures est déjà en place.Cela masque la complexité de la gestion de la mémoire,Permettre aux développeurs de mieux se concentrer sur la logique opérationnelle de base.

Pour notrePythonPour les développeurs,On pourrait être des chefs de file.Ne vous inquiétez pas de la façon dont il recycle les déchets produits pendant le fonctionnement du programme.Mais après tout, c'est la compétence intérieure d'une langue,Sommes - nous prêts à être unAPITu veux jouer au comédien??

1. Qu'est - ce que les ordures??

Quand notrePythonL'interpréteur exécute la syntaxe pour définir la variable,Demande de mémoire pour stocker la valeur de la variable,Et la capacité de mémoire est limitée,Il s'agit de récupérer l'espace mémoire occupé par la valeur de la variable.

Quand un objet ou une variable est inutile,Est considéré comme“Des ordures.“.Quel genre de variable est inutile??

a = 10000
Copier le Code

Quand l'interpréteur fonctionne ici,,Une partie de la mémoire est divisée pour le stockage 10000 Cette valeur.En ce moment 10000 Est variable a Cité

a = 30000

Lorsque nous modifions la valeur de cette variable,Un autre morceau de mémoire a été divisé pour le stockage 30000 Cette valeur,À ce stade, la variableaLa valeur référencée est30000.

À ce moment - là.,La nôtre. 10000 Il n'y a plus de variables pour le référencer.,On pourrait aussi dire que c'est devenu de la merde.,Mais il tient toujours la mémoire qu'il vient de lui donner..Alors notre interpréteur,Il faut récupérer cette mémoire..

2. Fuite de mémoire et débordement de mémoire

Ce que nous avons vu ci - dessus, c'est ce qui se passe pendant l'exécution du programme.“Des ordures.”,Et si,Des déchets ont été produits.,On ne s'en occupe pas.,Quelles sont les conséquences??Réfléchis.,Si votre maison ne jette jamais de déchets,Que se passe - t - il si les déchets sont laissés à la maison??

  1. La maison est pleine de déchets.,Il y a une belle femme qui veut être ta cible,Mais il n'y a plus de place pour elle..
  2. Tu peux vivre.,Mais la maison est pleine de déchets.,Et c'est une perte d'espace.,Doucement.,Un jour, ta maison sera pleine de déchets.

Ce qui s'est passé, c'est que tous les programmeurs de l'ordinateur ont peur.,Débordement de mémoire et fuites de mémoire,La lumière ralentit le programme,Un programme lourd s'écrase.

Débordement de mémoire:Quand le programme demande la mémoire,Pas assez de mémoire pour l'utiliser,- Oui. out of memory

Fuite de mémoire:Après avoir demandé la mémoire,Impossible de libérer l'espace mémoire demandé,Un risque de fuite de mémoire peut être ignoré,Mais les fuites de mémoire empilées ont de graves conséquences,Peu importe la quantité de mémoire,Tôt ou tard, il y aura de la lumière.

3. Nombre de références

Nous avons déjà mentionné la production de déchets parce que,L'objet n'est plus référencé par une autre variable.Alors,Comment notre interpréteur sait - il si un objet est référencé??

La réponse est:Nombre de références.pythonL'interne compte le nombre de fois qu'un objet est référencé par le mécanisme de comptage des références.Quand ce nombre devient0Quand,Ça veut dire que l'objet n'est pas référencé..À ce moment - là, c'est devenu“Des ordures.”.

Et quel est le sacré numéro de référence??Voyons le Code.

text = "hello,world"

Que fait la ligne de code ci - dessus??

  • Créer un objet de chaîne:Sa valeur esthello,world,
  • Ouvrir l'espace mémoire:Lorsque l'objet est instantané,L'interpréteur assigne un espace d'adresse mémoire à l'objet.Stocke la structure de cet objet dans cet espace d'adresse mémoire.

Regardons la structure de cet objet.

typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;

FamiliarisationcLangue ouc++Amis de,Ça devrait être très familier de voir ça,C'est la structure..C'est à cause de nous.PythonL'interpréteur officiel estCPython,Il y a beaucoup decBibliothèque de classe et interface.Ainsi, certaines données sous - jacentes sont stockées à travers une structure.Ça n'a pas d'importance pour les amis qui ne comprennent pas..

Ici.,Il suffit de se concentrer sur un seul paramètre:ob_refcnt

Ce paramètre est très magique,Il enregistre le nombre de fois que cet objet est référencé par une variable.Donc là - haut hello,world Le nombre de références pour cet objet est 1,Parce qu'il n'y a quetextCette variable fait référence à.

①Assignation d'initialisation des variables:

text = "hello,world"

②Transfert de référence variable: 

new_text = text

 

③Supprimer la première variable:

④Supprimer la deuxième variable:

del new_text

En ce moment "hello,world" Le nombre de références pour l'objet est:0,Comme des ordures..La prochaine étape,Il est temps qu'on récupère nos poubelles..

 

4. Comment le nombre de références change

Ci - dessus, nous avons appris ce qu'est le comptage des références.Quand ce paramètre changera - t - il??

4.1 Le cas du compte de référence plus un

  • Objet créé

    a = "hello,world"
  • Objet référencé par une autre variable(Assigner une valeur à une variable)

    b = a
  • L'objet est considéré comme un élément,Dans un contenant(Comme être mis sur une liste en tant qu'élément)

    list = []
    list.append(a)
  • Objet passé à la fonction comme argument

    func(a)

4.2 Nombre de références moins un

  • Les variables de référence de l'objet sont affichées détruites

    del a
  • L'assignation des variables de référence d'un objet fait référence à un autre objet

    a = "hello, Python" # aObjet de référence original pour:a = "hello,world"
  • Objet retiré du conteneur,Ou le conteneur est détruit(Exemple:Objet supprimé de la Liste,Ou la liste est détruite)

    del list
    list.remove(a)
  • Une référence a quitté son champ d'application

    func():
    a = "hello,world"
    return
    func() # Après l'exécution de la fonction,Variables locales dans le champ d'application de la fonctionaSera libéré

4.3 Voir le nombre de références pour l'objet

Si vous voulez voir le nombre de références d'un objet,Les modules intégrés sys Fourni getrefcount Comment vérifier.

import sys
a = "hello,world"
print(sys.getrefcount(a))

Attention!:Lorsqu'une référence est utilisée comme paramètre,Passer à getrefcount() Heure,Le paramètre crée en fait une référence temporaire.Donc,,getrefcount() Résultats obtenus,Plus que prévu 1

5. Mécanisme de collecte des ordures

En fait...PythonLe mécanisme de collecte des ordures,On en a déjà parlé..

PythonRéaliser la collecte des ordures par référence à la méthode de comptage,Lorsque le nombre de références d'un objet est0Quand,On récupère les ordures.Mais il y a aussi un problème si vous n'utilisez que le comptage des références.Alors...,pythonEncore une fois.Marquage-EffacerEtCollection par générationDeux mécanismes.

PythonLe mécanisme de comptage des références est principalement utilisé,Marquage-Une stratégie complétée par deux mécanismes de nettoyage et de collecte par génération.

Nous avons compris le nombre de références précédentes,Cette marque-Qu'est - ce que le nettoyage et la collecte intergénérationnelle??

5.1 Inconvénients du mécanisme de comptage des références

PythonLe mécanisme de collecte des ordures par défaut pour la langue est“Compteur de référence ”,L'algorithme est le plus ancienGeorge E. CollinsIn1960Pour la première fois,50Des années plus tard, aujourd'hui,L'algorithme est encore utilisé dans de nombreux langages de programmation.

Compteur de référence:Un par objet ob_refcnt Champ,Utilisé pour enregistrer le nombre de fois que l'objet est actuellement référencé,Chaque fois qu'une nouvelle référence pointe vers cet objet,Son nombre de référencesob_refcntPlus1,Compte chaque fois que la référence de l'objet échoueob_refcntMoins1,Une fois que le nombre de références de l'objet est0,L'objet est immédiatement recyclé,L'espace mémoire occupé par l'objet sera libéré.

Inconvénients:

  1. Un espace supplémentaire est nécessaire pour maintenir le nombre de références
  2. Impossible de résoudre le problème de référence circulaire

Qu'est - ce qu'un problème de référence circulaire?Voir l'exemple suivant

a = {"key":"a"} # Objet du dictionnaireaNombre de références pour:1
b = {"key":"b"} # Objet du dictionnairebNombre de références pour:1
a["b"] = b # Objet du dictionnairebNombre de références pour:2
b["a"] = a # Objet du dictionnaireaNombre de références pour:2
del a # Objet du dictionnaireaNombre de références pour:1
del b # Objet du dictionnairebNombre de références pour:1

Voir l'exemple ci - dessus,Il est clair que les deux variables ont été supprimées,Mais ces deux objets n'ont pas été libérés..La raison en est qu'aucun de leurs comptes de référence n'a été réduit à0.Et notre mécanisme de collecte des ordures ne fonctionne que si le nombre de références est0L'objet n'est libéré que lorsque.C'est un problème mortel insoluble..Les deux objets ne sont jamais détruits,Cela provoque une fuite de mémoire.

Comment résoudre ce problème?À ce moment - là. Marquage-Effacer C'est tout ce qu'il faut.Le nettoyage des étiquettes peut gérer ce cas de référence circulaire.

5.2 Marquage-Politique de nettoyage

PythonMarquage appliqué-Politique de nettoyage,Résoudre les problèmes de référence de boucle qui peuvent se produire avec les objets conteneur.

La stratégie comporte deux étapes pour la collecte des ordures.,Respectivement.:

  • Phase de marquage,Traverser tous les objets,Si elle est accessible(reachable),C'est - à - dire qu'il y a des objets qui le référencent,Marquer l'objet comme accessible;
  • Phase de nettoyage,Traverser à nouveau l'objet,Si vous trouvez un objet qui n'est pas marqué accessible,Recyclez - le.

Voici une brève introduction au marquage-Processus de purge de la politique

 

Accessibilité(Activités)Objet:DerootLes noeuds de collection ont(Par référence de chaîne)Le chemin atteint le noeud objet

Inaccessible(Inactif)Objet:DerootLe noeud de collection n'a pas(Par référence de chaîne)Le chemin atteint le noeud objet

Processus:

  1. Tout d'abord,,DerootDépart du noeud de collecte,Traverser tous les noeuds d'objets le long des bords dirigés
  2. Marquer les objets accessibles ou inaccessibles individuellement pour chaque objet
  3. Encore une fois, traversez tous les noeuds,Collecte des ordures pour tous les objets marqués inaccessibles、Destruction.

Marquage-Le nettoyage est une stratégie cyclique,C'est une mission programmée,Scan à intervalles réguliers.

Et marquer-L'ensemble de l'application est mis en pause lorsque le travail est nettoyé,Attendre la fin du nettoyage des étiquettes avant de reprendre le fonctionnement de l'application.

5.3 Stratégie de recyclage par génération

Le recyclage par génération est basé sur le nettoyage des étiquettes,À cause de nos marques-La politique de nettoyage bloquera nos programmes.Pour réduire le temps de pause de l'application,Python Adoption“Récupération par génération”(Generational Collection)Stratégie.Amélioration de l'efficacité de la collecte des déchets par l'échange d'espace et de temps.

La technologie de collecte des déchets par génération remonte au siècle dernier. 80 Un mécanisme de collecte des ordures mis au point au début des années 1990.

En termes simples,:Plus l'objet existe longtemps,Plus il est probable que ce ne soit pas de la merde.,Moins il faut collecter.

Python Diviser la mémoire en différentes collections en fonction du temps de vie de l'objet,Chaque collection est appelée une génération,Python Diviser la mémoire en 3“Génération”,Les jeunes générations(No 0 Génération)、Âge moyen(No 1 Génération)、Vieux temps(No 2 Génération).

Quand déclenchera - t - il le recyclage par génération??

import gc
print(gc.get_threshold())
# (700, 10, 10)
# Voici le seuil de la politique de recyclage par défaut
# Vous pouvez également définir vous - même les seuils de la politique de recyclage
gc.set_threshold(500, 5, 5)
  • 700:Indique que lorsque le nombre d'objets assignés atteint700Heure,Pour une fois0Recyclage par procuration
  • 10:En cours10Une fois0Déclenchez - le une fois après le recyclage1Recyclage par procuration
  • 10:En cours10Une fois1Déclenchez - le une fois après le recyclage2Recyclage par procuration

 

5.4 gcModule

  • gc.get_count():Obtient les compteurs qui automatisent actuellement la collecte des ordures,Renvoie une longueur de3Liste de
  • gc.get_threshold():AccèsgcFréquence de la collecte automatique des ordures dans le module,Par défaut(700, 10, 10)
  • gc.set_threshold(threshold0[,threshold1,threshold2]):Définir la fréquence à laquelle la collecte automatique des ordures est effectuée
  • gc.disable():python3Par défautgcMécanismes,Vous pouvez utiliser cette méthode pour fermer manuellementgcMécanismes
  • gc.collect():Appeler manuellement le mécanisme de collecte des ordures pour récupérer les ordures

En fait...,Maintenant qu'on a choisipython,La performance n'est pas la chose la plus importante.Je crois que la plupartpythonLes ingénieurs n'ont même pas eu de problèmes de performance,Parce que les performances actuelles de la machine peuvent compenser.Pour la gestion de la mémoire et la collecte des ordures,pythonFournit un moyen de se débarrasser de l'aubergiste pour nous concentrer davantage sur le niveau d'affaires,Ce n'est pas mieux que la vie.,Je l'utilise.pythonUne idée?.Si j'avais encore besoin de quelque chose commeC++C'est une gestion prudente de la mémoire.,Alors pourquoi devrais - je utiliserpythonEt alors??C'est notre commodité..Alors...,Ne t'inquiète pas..Le plus tôt sera le mieux.!

Enfin, je vous souhaite à tous des progrès quotidiens. !!ApprendrePythonLe plus important, c'est l'état d'esprit.Nous devons rencontrer beaucoup de difficultés dans le processus d'apprentissage,Peut - être qu'il n'y a pas de solution pour se casser la tête.C'est normal.,Ne vous précipitez pas pour vous nier,Doute de soi.Si tout le monde a des difficultés au début de ses études,Je cherche quelqu'un.pythonEnvironnement d'apprentissage et de communication,Peut se joindre à nous【pythonJupe】,Obtenir du matériel d'apprentissage,Discuter ensemble,Ça va économiser beaucoup de temps,Réduire beaucoup de problèmes rencontrés.

版权声明
本文为[Un nouveau pêcheur, Manon.]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/11/20211125184600583u.html

  1. python3.7 FileNotFoundError: [WinError 2] 系统找不到指定的文件。
  2. 最全面的Python重点知识汇总
  3. python中 我想爬取一个网页,我在cmd中pip list中已经把requests 以及bs4 弄好了 但是他还是提示我没有那个模块
  4. You can learn Python articles without reading online classes (the first day)
  5. 在Python和Go项目之后使用Rust的经验分享 - scaleway
  6. 使用PyO3从Python调用 Rust:加速Python
  7. Python 3.7 filenotfounderror: [winerror 2] le système n'a pas pu trouver le fichier spécifié.
  8. Python 一切皆对象
  9. 【Pandas学习笔记01】强大的分析结构化数据的工具集
  10. 求各位亲们可以解答一下嘛,为什么跑不出来呀,大学Python
  11. 【Pandas学习笔记01】强大的分析结构化数据的工具集
  12. python飞机大战如何让飞机始终在界面中,不能跑出界面
  13. Python代码阅读(第63篇):数字奇偶性
  14. python建立⼀個圖形介⾯應⽤(GUI app)
  15. python接口自动化的html格式报告以邮件形式发送展示的原文很丑怎么处理
  16. 针对初学者,我建议你学这 3 个 Python AutoEDA 工具包
  17. #yyds干货盘点#Python-爬虫_urlib一个类型和六个方法
  18. Pour les débutants, je vous recommande d'apprendre ces 3 kits autoeda Python
  19. 我想问python怎么入门嘞?求各路人士
  20. Summary of today's Django lessons: data reverse query triggers error field 'score_ jieshoufankui‘ expected a number but got ‘‘-20211109
  21. 关于#python_while循环的写法#的问题,如何解决?
  22. Python异常处理中异常的种类有哪些?你知道几个?
  23. Python异常處理中异常的種類有哪些?你知道幾個?
  24. Quels sont les types d'exceptions dans la gestion des exceptions python? Combien en savez - vous?
  25. À propos de # Python Comment résoudre le problème de l'écriture de la Boucle while?
  26. Python如何操作system.data.sqlite数据库
  27. python数字游戏,让你欲罢不能
  28. Python中的可迭代对象、迭代器、For循环工作机制、生成器
  29. 一个从没接触过编程的人,如何自学进入Python行业?
  30. 一份超级实用的 Python ”技巧“清单
  31. Python 程序员给上路初学者的3点忠告
  32. 3 conseils pour les débutants sur la route par les programmeurs Python
  33. Une liste de conseils Python super pratiques
  34. Comment quelqu'un qui n'a jamais été en contact avec la programmation peut - il apprendre à entrer dans l'industrie python?
  35. Objets itérables, itérateurs, pour le mécanisme de travail circulaire, générateurs en python
  36. Les Jeux de chiffres Python vous font vous arrêter
  37. Comment Python fonctionne avec la base de données system.data.sqlite
  38. Python之html与markdown互相转换
  39. Python之html與markdown互相轉換
  40. Conversion HTML et markdown de Python
  41. Python生成的随机数,要怎么设定成随机数a小于随机数b啊
  42. Python生成的隨機數,要怎麼設定成隨機數a小於隨機數b啊
  43. Le nombre aléatoire généré par Python, comment définir le nombre aléatoire a est inférieur au nombre aléatoire B
  44. Python爬虫能做什么
  45. Python老技师给上路初学者的3点忠告
  46. 3 conseils aux débutants sur la route de l'ancien technicien Python
  47. Que peuvent faire les reptiles Python
  48. The code NPM cloned from git will report a python error after it is installed!
  49. 数据分析从零开始实战,Pandas读写CSV数据
  50. Python基础(十二):类与对象
  51. Python Foundation (12): classes et objets
  52. Python基礎(十二):類與對象
  53. L'analyse des données commence à zéro et pandas lit et écrit les données CSV
  54. Python Qt GUI设计:QSlider滑动条类(基础篇—16)
  55. #yyds干货盘点#数据分析从零开始实战,Pandas读写CSV数据
  56. This paper designs an examination system for automatically setting questions and judging papers by using Python standard library language to investigate the ability of users to calculate four integers within 100.
  57. Yyds Dry Inventory # Data Analysis started from zero, pandas read and write CSV Data
  58. python数据结构:数组、列表、栈、队列及实现
  59. Python编程真的是未来人工智能的主流吗?
  60. Python编写通讯录,支持模糊查询,利用数据库存储