• 20191031:Python底层机制


    20191031:Python底层机制

    python底层从3个方面来说,分别是:

    1. 引用计数机制
    2. 垃圾回收机制
    3. 内存池机制

    引用计数机制

    使用引用计数来追踪内存中的对象,所有对象都有引用计数,并且这个引用计数一般比我们想象的次数多,对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存,可以通过sys.getrefcount( )来查看对象应用次数。如下:

    >>> a =19880924

    >>> sys.getrefcount(19880924)

    3

    >>> b =19880924

    >>> sys.getrefcount(19880924)

    3

    >>> c = 19880924

    >>> sys.getrefcount(19880924)

    可以看到19880924的引用次数没有随着对象的声明而增加。

    >>> c = 19880924

    >>> sys.getrefcount(19880924)

    3

    >>> sys.getrefcount(c)

    2

    >>> d = c

    >>> sys.getrefcount(c)

    3

    >>> e = c

    >>> sys.getrefcount(c)

    4

    但是如果是对象的引用,则对象的引用次数增加

    内存存储机制类似如下:

     

    引用计数增加的情况:

    1,一个对象分配一个新名称

    2,将其放入一个容器中(如列表、元组或字典)

    引用计数减少的情况:

    1,使用del语句对对象别名显示的销毁

    2,引用超出作用域或被重新赋值

    垃圾回收机制

    1. 当一个对象的引用计数为0的时候就被垃圾回收给回收掉了
    2. 解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

    a)     假如2个对象相互引用,由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。针对这种情况适用于2

    内存池机制

    Pymalloc机制:引入内存池机制,是用于管理小块内存的申请和释放的,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

    python回收的内存放到内存池而不是返回给操作系统。

  • 相关阅读:
    ios 10 更新所遇到的坑
    ios-coreText做微信点赞功能
    iOS 利用mask layer 使view中扣掉一块露出下边的view
    IOS-开发日记24
    ios 开发日记 23
    ios 开发日记 22-iOS 保持界面流畅的技巧
    ios 开发日记 21 -自动处理键盘事件的第三方库:IQKeyboardManager
    ios 开发日记 20
    ios 开发日记19-应用提交申请后加急审核
    ios开发日记-18上传appStore时,遇到错误,代码为ERROR ITMS-90049
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11773302.html
Copyright © 2020-2023  润新知