zoukankan      html  css  js  c++  java
  • 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回收的内存放到内存池而不是返回给操作系统。

  • 相关阅读:
    聊聊ES6中的generator
    generator-yield到底是个啥
    jquery 常用方法中那些我不知道的事
    jquery 获取textarea文本值详解
    数组去重
    五指棋人机大战之ai篇
    五指棋人机大战之ui篇
    css控制背景图像不随滚动条的滚动而滚动
    用canvas画会旋转的伞
    CSS3 实现太极图案
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11773302.html
Copyright © 2011-2022 走看看