为什么Python要使用有明显缺陷的引用计数而不是像JavaScript一样的标记清除?
引用计数有循环计数这个明显缺陷,那为什么Python还要使用引用计数而不是标记清除呢?
回复内容:
引用计数最大的好处是回收及时:一个对象的引用计数归零的那一刻即是它成为垃圾的那一刻,同时也是它被回收的那一刻。而这正式 mark-sweep 等 tracing GC 算法的劣势:一个对象成为垃圾之后,直到被下一轮 GC 清理掉之前,还要在内存中留存一段时间(floating garbage)。Python 的 GC 设计是,对于内部不包含指向其他对象的引用的对象(如字符串、数值类型等),采用引用计数,因为这些对象根本不可能产生循环引用。对于 List、Map 等可能产生循环引用的对象,则采用 mark-sweep。所以我的理解是,Python 的 GC 设计一定程度上综合了两类 GC 算法的优点——即保证回收的完整性,又力求回收的及时性。
Update
上文描述有偏颇,把评论里 R 大的补充贴上来:
对List啊Map啊Set之类的引用计数也在起作用的。mark-sweep只是备份。不过通过引用计数来提高回收及时性这点仍然还是成立的。 这是一种设计取舍。用CPython的大家高兴就好呗。
整套引用计数机制嵌在ceval.c里了,所有对象都要被它折腾到。
换句话说不是List不被引用计数,而是List的引用计数如果自然降到零的话就自然按照引用计数机制释放;否则当cycle GC启动的时候就会对它处理。
其它Python实现有许多不用引用计数的,不高兴可以用它们(逃
另外CPython的引用计数是有mark-sweep备份的,不怕循环引用。
官网解释了这个选择(但其实也没说什么…):https://docs.python.org/2/faq/design.html#how-does-python-manage-memory
The details of Python memory management depend on the implementation. The standard C implementation of Python uses reference counting to detect inaccessible objects, and another mechanism to collect reference cycles, periodically executing a cycle detection algorithm which looks for inaccessible cycles and deletes the objects involved. The gc module provides functions to perform a garbage collection, obtain debugging statistics, and tune the collector’s parameters.
In the absence of circularities and tracebacks, Python programs do not need to manage memory explicitly.
Why doesn’t Python use a more traditional garbage collection scheme? For one thing, this is not a C standard feature and hence it’s not portable. (Yes, we know about the Boehm GC library. It has bits of assembler code for most common platforms, not for all of them, and although it is mostly transparent, it isn’t completely transparent; patches are required to get Python to work with it.)
...
Traditional GC also becomes a problem when Python is embedded into other applications. While in a standalone Python it’s fine to replace the standard malloc() and free() with versions provided by the GC library, an application embedding Python may want to have its own substitute for malloc() and free(), and may not want Python’s. Right now, Python works with anything that implements malloc() and free() properly.
然后请看这篇文章介绍较新的Python的“mark-swep GC”其实还是“分代式”的:http://patshaughnessy.net/2013/10/30/generational-gc-in-python-and-ruby
然后就是JavaScript也不一定是用mark-sweep的…语言规范没这么规定,实际实现也不全是用mark-sweep。 Python现在还用引用计数是因为很久很久以前Python很老土的在引用计数上打了个补丁,就这么一直打补丁打过来的
Garbage Collection for Python 先简单正面回答下题主,为啥python要用呢,因为作者愿意
如果题主是想问,改用“更好”的标记清除是不是一个更好的选择,那就可以多说一些了
首先,这个前提并不成立,学术一点的观点可以看《垃圾回收》这书,里面用“没有银弹”来形容算法的选择,即没有谁比谁好,只有在具体的场景下谁比谁适合的问题
引用计数最大好处是实时性,其次是在没有循环引用的情况下避免过多的over-allocation,内存不会浪费
这个实时性的重要性有多大呢,我猜在某些场景下,比大多数人认为的都重要很多,具体可以看我的blog文章,这篇也正好是在说其它会stop world的gc算法的缺点时候写的:
雪崩效应 - xtlisk的专栏
(文章是一个系列,对语言理论有兴趣的可以多交流:)
再者,循环引用真的是一个很大的缺陷吗,这个其实一直有争论,有人用统计来证明绝大多数代码和对象并不产生循环引用,用代码来规避即可,但也有人说在特定场景下会非常多(比如游戏中角色、装备、buff之间的关系),一般认为还是一个很大缺陷的,但并非不能解决
其次,问为什么之前先看是不是,py标准版的确主要用引用计数,但是其他实现并非这样,如Jython就直接依赖所在jvm的了。而且标准版并没有无视循环引用这个缺陷,在2.5就引入了gc模块,针对循环引用用局部标记清扫,注意是局部标记清扫而非普通的标记清扫,这个思想虽然一样但还是有特殊点,具体可以看《垃圾回收》这本书
事实上py用ref count是有一个缺陷的,一定程度甚至是很大程度上导致GIL这种机制,吐槽GIL的人非常多,但很少注意到跟GC的选择有关 Python刚刚被写出来的时候标记清除并没有今天这么大行其道, Java也是从引用计数走过来的。 ObjectiveC还在使用引用计数。
大部分策略总归有两面性, 比如你也要看看引用计数的好处啊:
- 如果程序员能够做到不循环引用,那效率还是很高,不会带来VM停机啊
- 再一个来说为什么用引用计数?简单啊, 你听完马上自己就可以去写一个。 易懂啊,几分钟就能说明白了。 可以对比标记清除
巴拉巴拉的絮絮叨叨
Python memory management compared with other language runtime 你调试Java程序时在暂挂态触发一个JVM GC看看,不感觉卡一下吗? 为什么JavaScript要使用有明显缺陷的标记清除而不是像Python一样的引用计数? 为什么JavaScript要使用有明显缺陷的标记清除而不是像Python一样的引用计数?
标记清除有性能低下这个明显缺陷,那为什么JavaScript还要使用标记清除而不是引用计数呢? 引用计数比较方便让第三方拓展模块参与管理cpython的内存。第三方的拓展模块可以容易的保存cpython的指针而不必担心这个指针所指向的内存被释放了。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

La vitesse du XML mobile à PDF dépend des facteurs suivants: la complexité de la structure XML. Méthode de conversion de configuration du matériel mobile (bibliothèque, algorithme) Méthodes d'optimisation de la qualité du code (sélectionnez des bibliothèques efficaces, optimiser les algorithmes, les données de cache et utiliser le multi-threading). Dans l'ensemble, il n'y a pas de réponse absolue et elle doit être optimisée en fonction de la situation spécifique.

Pour générer des images via XML, vous devez utiliser des bibliothèques de graphiques (telles que Pillow et JFreechart) comme ponts pour générer des images basées sur des métadonnées (taille, couleur) dans XML. La clé pour contrôler la taille de l'image est d'ajuster les valeurs de & lt; largeur & gt; et & lt; height & gt; Tags dans XML. Cependant, dans les applications pratiques, la complexité de la structure XML, la finesse du dessin de graphiques, la vitesse de la génération d'images et la consommation de mémoire et la sélection des formats d'image ont tous un impact sur la taille de l'image générée. Par conséquent, il est nécessaire d'avoir une compréhension approfondie de la structure XML, compétent dans la bibliothèque graphique, et de prendre en compte des facteurs tels que les algorithmes d'optimisation et la sélection du format d'image.

Une application qui convertit le XML directement en PDF ne peut être trouvée car ce sont deux formats fondamentalement différents. XML est utilisé pour stocker des données, tandis que PDF est utilisé pour afficher des documents. Pour terminer la transformation, vous pouvez utiliser des langages de programmation et des bibliothèques telles que Python et ReportLab pour analyser les données XML et générer des documents PDF.

Il n'y a pas de fonction de somme intégrée dans le langage C, il doit donc être écrit par vous-même. La somme peut être obtenue en traversant le tableau et en accumulant des éléments: Version de boucle: la somme est calculée à l'aide de la longueur de boucle et du tableau. Version du pointeur: Utilisez des pointeurs pour pointer des éléments de tableau, et un résumé efficace est réalisé grâce à des pointeurs d'auto-incitation. Allouer dynamiquement la version du tableau: allouer dynamiquement les tableaux et gérer la mémoire vous-même, en veillant à ce que la mémoire allouée soit libérée pour empêcher les fuites de mémoire.

Utiliser la plupart des éditeurs de texte pour ouvrir des fichiers XML; Si vous avez besoin d'un affichage d'arbre plus intuitif, vous pouvez utiliser un éditeur XML, tel que Oxygen XML Editor ou XMLSPY; Si vous traitez les données XML dans un programme, vous devez utiliser un langage de programmation (tel que Python) et des bibliothèques XML (telles que XML.ETREE.ElementTree) pour analyser.

Les outils de mise en forme XML peuvent taper le code en fonction des règles pour améliorer la lisibilité et la compréhension. Lors de la sélection d'un outil, faites attention aux capacités de personnalisation, en gérant des circonstances spéciales, des performances et de la facilité d'utilisation. Les types d'outils couramment utilisés incluent des outils en ligne, des plug-ins IDE et des outils de ligne de commande.

Il n'y a pas d'application qui peut convertir tous les fichiers XML en PDF car la structure XML est flexible et diversifiée. Le noyau de XML à PDF est de convertir la structure des données en une disposition de page, ce qui nécessite l'analyse du XML et la génération de PDF. Les méthodes courantes incluent l'analyse de XML à l'aide de bibliothèques Python telles que ElementTree et la génération de PDF à l'aide de la bibliothèque ReportLab. Pour le XML complexe, il peut être nécessaire d'utiliser des structures de transformation XSLT. Lorsque vous optimisez les performances, envisagez d'utiliser multithread ou multiprocesses et sélectionnez la bibliothèque appropriée.

Il est impossible de terminer la conversion XML à PDF directement sur votre téléphone avec une seule application. Il est nécessaire d'utiliser les services cloud, qui peuvent être réalisés via deux étapes: 1. Convertir XML en PDF dans le cloud, 2. Accédez ou téléchargez le fichier PDF converti sur le téléphone mobile.
