当你编写一个 Python 程序时,你可能不会花太多时间去思考你停止使用的所有东西会发生什么。您创建变量、对象、数据结构...当你用完它们时,你就可以继续前进了。

但是等等,在引擎盖下,谁在清理你留下的所有烂摊子?

答案是 Python 的垃圾回收器。

让我们真正谈谈它是什么,它是如何工作的,以及为什么有时您可能想要给予它一点额外的关注。

所以。。。垃圾回收器到底是什么?

想象一下你正在做晚饭。你切菜、打开包装、用完食材,现在你的厨房一团糟。必须有人清理它,否则最终你会用完柜台空间。

在 Python 中,垃圾回收器 (GC) 就像您的无声厨房助手。

它在后台悄悄地工作,清理所有 “垃圾”,即您不再使用的内存。

当您的程序创建列表、字符串、字典等对象时,Python 会将它们存储在内存中。

当你用完它们时,当没有更多对它们的引用时,Python 的 GC 会介入并扔掉它们。

您不必告诉 Python,“嘿,我已经完成了这个列表,您现在可以删除它。

它就是知道。

它怎么知道要清洁什么?

Python 主要使用一种称为引用计数的东西。

这个想法是这样的:

  • 每个对象都会跟踪仍指向它的引用或指针数。
  • 如果变量仍在使用对象,则引用计数将保持在 0 以上。
  • 当引用计数下降到 0 时,Python 知道它可以安全地丢弃对象。

例:

a = [1, 2, 3]   # a list is created, reference count = 1
b = a           # another reference to the same list, count = 2
del a           # remove one reference, count = 1
del b           # remove the last reference, count = 0 → Garbage collected!
 

很聪明,对吧?

参考计数足够吗?

不,这就是它变得辣的地方。

如果两个对象相互引用,但没有其他对象使用它们,该怎么办?

这称为循环引用。

例:

class MyObj:
    def __init__(self):
        self.ref = None

a = MyObj()
b = MyObj()

a.ref = b
b.ref = a
 

现在指向 ,并指向返回 。即使我们同时删除了 和 ,它们仍然相互依赖。他们的引用计数永远不会下降到零。这就是为什么 Python 也有一个成熟的垃圾回收器。它可以更深入地观察,发现这些“卡在一起”的物体,并清理它们。abbaab

深入挖掘分代垃圾回收→

Python 使用一种称为分代垃圾回收的巧妙技巧来加快速度。

基本思路如下:

  • 大多数物体会很早就死去。
  • 经常检查新对象。
  • 较旧的对象检查频率较低,因为如果它们存活了一段时间,它们可能很重要。

Python 将对象分为三

  1. 第 0 代:全新的婴儿(最常检查)
  2. 第 1 代:稍留存下来的对象
  3. 第 2 代:老前辈(检查频率较低)

这个系统可以节省时间,因为 Python 不会浪费精力一次又一次地检查相同的对象。

如何实际使用 GC

您可以忽略垃圾回收器吗?99% 的时间是肯定的。通常,您不必担心任何这些。Python 完美地处理了这一切。但有时,尤其是在 Web 应用程序或数据科学项目等大型复杂程序中,您可能希望深入了解。方法如下:

如果您需要在特定时间释放内存,请手动触发垃圾回收:

import gc
gc.collect()
 

如果您知道垃圾回收器会妨碍您,请暂时禁用它。例如,当您快速创建大量短期对象时。

gc.disable()
# your code flow here
gc.enable()
 

通过使用 such 工具来跟踪内存泄漏,以查看在不应该出现的时候存在什么。gc.get_objects()

最后

Python 的垃圾回收器就像那个好朋友,他总是在聚会结束后不经询问就清理干净。你不会注意到它,但如果没有它,生活会困难得多。通过稍微了解它的工作原理,您可以编写更智能的程序,更快地解决奇怪的错误,并使您的应用程序变得更好。

 

 

出处:https://dev.to/

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
意见
建议
发表
评论
返回
顶部