IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> python不同类型对内存的使用 -> 正文阅读

[开发工具]python不同类型对内存的使用

首先先看一个计算机中的概念
1. bit就是位,也叫比特位,是计算机表示数据最小的单位, 它是长度为8的一串二进制码
2. byte就是字节 1 byte=8 bit 也就是 1 B
3. 1 KB=1024 B

python可以使用 sys 中的 getsizeof函数来获取各种数据类型(对象)占用的内存大小

使用方式:

>>> import sys
>>> sys.getsizeof(1)    # out: 28
>>> sys.getsizeof(1.0)  # out: 24
>>> sys.getsizeof('1')  # out: 50

在c 语言中int 是占4个字节, 为什么int 会是28 Bytes个呢?
stackoverflow 给出了一个python内存占用的列表:python内存使用情况
在这里插入图片描述
这里有提到一个 +4 bytes about every 30 powers of 2
翻译成中文就是: 每2 ** 30内存的占用就增加4个字节

sys.getsizeof(2**29)  # out: 28
sys.getsizeof(2**30)  # out: 32
sys.getsizeof(2**59)  # out: 32
sys.getsizeof(2**60)  # out: 36

回到上面的问题: 那么在python中int类型为什么就要占用28 Bytes个呢?
先看个demo:

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> sys.getsizeof(a)
136
>>> sum([sys.getsizeof(i) for i in a])
280

可以发现列表 a 竟然要比单个元素内存累加的要小, 这说明里面的元素并非仅仅是一个int 类型的数字,
它应该还携带了一些别的东西, 这时候我想起经典的一句话: 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 int 的实际的值只是相应C结构中的一个属性, 这也就是为什么python中的int 不是4个字节而是28

就在我满心欢喜的时候突然又发现一个问题:
在这里插入图片描述
为什么在 python3.7 和3.8 的结果不一致呢?
意外的发现: 这里只能去c语言的源码里面找结果了

python中c语言部分参考文档: https://blog.csdn.net/qm5132/article/details/100557950

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:07:34  更:2021-09-03 12:08:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 7:35:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码