• 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回收的内存放到内存池而不是返回给操作系统。

  • 相关阅读:
    没有技术驱动型公司 | 每个人都得加班 | 关注软技能
    各种15min(启动、横盘、破位)样例
    最新win10教育版激活密匙 win10各版本永久激活序列号
    大数定律具体是个什么概念?
    统计与概率——马同学高等数学
    三星MagicInfo Express软件制作介绍
    !!网上找的【英语单词词根记忆顺口溜】
    一个故事轻松记忆常见252个英语字根
    分享一个开源的音频分析软件
    C#连接XAMPP中的mysql 数据库(windows)
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11773302.html
Copyright © 2020-2023  润新知