• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python 中sys.getsizeof的用法说明

    科班出身的码畜一直被灌输一条上帝圣经:“一个int占4个字节,一个char占1个字节,一个float占4个字节。。。”,

    今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占用的内存大小和c++/Java完全不一样~

    前提概述:python中一切都是对象,so python中其实根本不存在int float这些类型,int其实是一个python对象。

    int:28float:24string:54list():64{}:288ste():224

    此外,

    (1)sys.getsizeof只计算实际使用的内存大小,引用所消耗的内存大小不计算。

    (2)sys.getsizeof只能作为计算内存大小的参考~

    这里有一个问题,为什么python各个数据类型占用大小和c++中不一致呢?

    这里本质上是由python的实现所决定的,python代码在运行的时候会由python解析器执行,具体会解析为C语言的某种结构。也就是说,python中的一个int(或其他)映射到c语言中会是一种复杂结构体。

    以python的int为例说明,下面是python的int在C中的具体形式:

    typedef struct {
        PyObject_HEAD
        long ob_ival;
    } PyIntObject;
    struct _longobject {
        long ob_refcnt;  // 引用计数
        PyTypeObject *ob_type; //变量类型
        size_t ob_size;  //实际占用内容大小
        long ob_digit[1];  //存储的实际python值
    };

    发现没有,python实际的值只是相应C结构中的一个属性,难怪python的int占28个字节,而C语言只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍大小!

    发现没有,python实际的值只是相应C结构中的一个属性,难怪python的int占28个字节,而C语言只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍大小!

    ps:想要精准控制内存大小,使用c++或者Java吧~

    补充:使用 sys.getsizeof 查看 python 对象的内存占用

    使用 sys.getsizeof 方法可以查看 python 对象的内存占用,单位:字节 (byte)

    实际上是调用了 __sizeof__ 方法:

    In [35]: import sys
    
    In [36]: sys.getsizeof('hello world')
    Out[36]: 60
    
    In [37]: 'hello world'.__sizeof__()
    Out[37]: 60
    

    有些数据类型在 Python3 和 Python2 中占用的内存是不同的,

    例如 range :

    # python3
    In [38]: sys.getsizeof(range(999))
    Out[38]: 48
    
    In [39]: sys.getsizeof(iter(range(999)))
    Out[39]: 48
    
    # python2
    >>> sys.getsizeof(range(999))
    8064
    >>> sys.getsizeof(iter(range(999)))
    64
    

    关于这个值是怎么算出来的,有待研究~

    暂时已知:这个值包括该对象的数值、签名(包括数据类型、参数、调用方式等)等一系列数据所占总内存。可变对象所占内存可能极小,因为对象是指针,指向很大的数据。

    In [65]: s = sys.getsizeof
    
    In [66]: s(1)
    Out[66]: 28
    
    In [67]: s(11)
    Out[67]: 28
    
    In [68]: s(11111111)
    Out[68]: 28
    
    In [69]: s(1111111111)
    Out[69]: 32
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Python getsizeof()和getsize()区分详解
    • python—sys模块之获取参数的操作
    • 解决python中os.system调用exe文件的问题
    • 使用Python对Syslog信息进行分析并绘图的实现
    • python中sys模块的介绍与实例
    • python sys.stdin和sys.stdout的用法说明
    上一篇:关于python3安装pip及requests库的导入问题
    下一篇:详解Python装饰器之@property
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python 中sys.getsizeof的用法说明 python,中,sys.getsizeof,的,用法,