为什么python同时使用引用计数和gc的标记和扫描?

sha*_*awn 20 python garbage-collection

我的问题是为什么python使用引用计数和gc的标记和扫描?为什么不只是标记和扫描?

我最初的猜测是,使用引用计数可以轻松删除非循环引用的对象,这可能会加速标记和扫描并立即获得内存.不知道我的猜测是否正确?

有什么想法吗?

非常感谢.

Dun*_*can 19

Python(该语言)没有说它使用哪种形式的垃圾收集.主要实现(通常称为CPython)就像您描述的那样.其他版本如Jython或IronPython使用纯垃圾收集系统.

是的,早期收集有一个好处,参考计数,但CPython使用它的主要原因是历史.最初没有循环对象的垃圾收集,因此循环导致内存泄漏.C API和数据结构主要基于引用计数原理.当添加真正的垃圾收集时,不能打破现有的二进制API和依赖它们的所有库,因此必须保留引用计数.


Dan*_* D. 14

引用计数比垃圾收集更快地释放对象.

但由于引用计数无法处理无法访问的对象之间的引用循环,因此Python使用垃圾收集器(实际上只是一个循环收集器)来收集它们存在时的循环.