python类对象内存分析_python 对象内存分析

2023-11-08

python对象内存分析

一、python内建对象

python内建对象占用内存的情况又分为定长对象与非定长对象(变长)

1.1 定长对象,对象在内存中所占大小不会变化的对象

包括int,float,long,bool,complex和dict

测试程序如下:

#!/usr/bin/env python

#-*- coding:utf-8 -*-

import sys

print "value\t\ttype\t\tmemsize"

#int test

alist=[0,1,10,-1,-444,12313]

for i in alist:

print "%d\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i))

#float test

blist=[0.0,1.0,111.1,2323.22,-1.1]

for i in blist:

print "%f\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i))

#long test

clist=[0l,1l,2l,-1111l,45445l]

for i in clist:

print "%d\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i))

#bool test

dlist=[True,False]

for i in dlist:

print "%s\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i))

#complex test

elist=[0j,1+0j,1+1j,1000-23j,-100+5j]

for i in elist:

print i,"\t\t%s\t\t%s"%(type(i),sys.getsizeof(i))

#dict test

flist=[{},{'a':'b'},{'a':'b','c':1},{'a':'b','c':1,'d':'你好'}]

for i in flist:

print i,"\t\t%s\t\t%s"%(type(i),sys.getsizeof(i))

运行结果如下:

valuetypememsize

024

124

1024

-124

-44424

1231324

0.00000024

1.00000024

111.10000024

2323.22000024

-1.10000024

024

128

228

-111128

4544528

True24

False24

0j 32

(1+0j) 32

(1+1j) 32

(1000-23j) 32

(-100+5j) 32

{} 280

{'a': 'b'} 280

{'a': 'b', 'c': 1} 280

{'a': 'b', 'c': 1, 'd': '\xe4\xbd\xa0\xe5\xa5\xbd'} 280

有运行结果可以看出各个定长对象所占的内存:

int和float:24

long:这个有点特殊,对于0l,python识别为long type,但是所占内存是24,除了0l所占内存为24以外,其他的都为28

complex(复数):32

dict(字典):280

1.2 变成对象,会随着对象变化所占用的内存会变化

包括:list,tuple,str

测试代码:

#/usr/bin/env python

#-*- coding: utf-8 -*-

import sys

#str test

print "str-length\ttype\tmemsize"

ua='你好'

ga=ua.decode('utf-8').encode('gbk')

ba=ua.decode('utf-8').encode('big5')

ga1=ua.decode('utf-8').encode('gb2312')

alist=['','a','ab',ua,ga,ba,ga1]

for s in alist:

print "%d\t%s\t%s"%(len(s),type(s),sys.getsizeof(s))

print "list-length\ttype\tmemsize"

#list test

alist=[[],['a','b'],['abc','你好'],[11,12,'eee']]

for li in alist:

print "%d\t%s\t%s"%(len(li),type(li),sys.getsizeof(li))

print "%d\t%s\t%s"%(len(alist),type(alist),sys.getsizeof(alist))

#tuple test

print "tuple-len\ttype\tmemsize"

alist=((),('a',),('abc','你好'),(11,12,'eeee'))

for tp in alist:

print "%d\t%s\t%s"%(len(tp),type(tp),sys.getsizeof(tp))

print "%d\t%s\t%s"%(len(alist),type(alist),sys.getsizeof(alist))

结果:

str-lengthtypememsize

037

138

239

643

441

441

441

list-lengthtypememsize

072

288

288

396

4104

tuple-lentypememsize

056

164

272

380

488

分析结果可知:

str:空str所占内存为37,若str长度每加1,则内存所占大小相应加1

list:空列表所占内存为72,长度每增加1,则所占内存加8

tuple:空元组所占内存为56,长度每加1,所占了内存加8

空字符串为什么是37,而不是36或38,因为这里介绍所有的对像内存都为偶数,python内部维护字符串的机制和C中维护字符串的机制是一样的,即在末尾加'\0',这个占了1个字节,所以内存大小表现为36+1=37

补充:

python中还有一个比较特殊的对象,就是类型对像

>>> tlist=(int,float,long,str,complex,dict,list,tuple,bool,type)

>>> for i in tlist:

... print sys.getsizeof(i)

...

872

872

872

872

872

872

872

872

872

872

类型对象也是定长的为872

基类对象object所占内存也为872

二、自建对象

测试程序:

#!/usr/bin/env python

import sys

class A:

def __init__(self):

self.value=2

def test(self):

print self.value

class B(object):

def test(self):

print "test"

class C(float):

def __init__(self):

self.value=1

def test(self):

print self.value

class D(object):

pass

class E(A):

pass

print "A :%s\t%s"%(type(A),sys.getsizeof(A))

print "A():%s\t%s"%(type(A()),sys.getsizeof(A()))

print "B :%s\t%s"%(type(B),sys.getsizeof(B))

print "B():%s\t%s"%(type(B()),sys.getsizeof(B()))

print "C :%s\t%s"%(type(C),sys.getsizeof(C))

print "C():%s\t%s"%(type(C()),sys.getsizeof(C()))

print "D :%s\t%s"%(type(D),sys.getsizeof(D))

print "D():%s\t%s"%(type(D()),sys.getsizeof(D()))

print "E :%s\t%s"%(type(E),sys.getsizeof(E))

print "E():%s\t%s"%(type(E()),sys.getsizeof(E()))

结果:

A :104

A():72

B :904

B():64

C :904

C():72

D :904

D():64

E :104

E():72

有结果可以看出:

A和E对象没有继承类型对象,未申明基类的情况下,类型python解释为’classobj',所占内存为104,实例化后类型为instance 内存为72

BD对象都是继承自基类object,类型为type,所占内存为904,实例化后类型为class,所占内存为64

C对象继承自类型对象 float,类型为type,所占内存为904,实例化后类型为class,所占内存为72

PS:object是所有对象的基类,python中所有对象都继承自object

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python类对象内存分析_python 对象内存分析 的相关文章

  • Python线程,以及多线程带来的数据错乱和死锁的解决方法

    摘至本人有道云笔记 Python线程 1 python多线程的创建 在Python中 同样可以实现多线程 有两个标准模块thread和threading 不过我们主要使用更高级的threading模块 threading模块提供的类 Thr
  • 日撸 Java 三百行(51-60天,kNN 与 NB)

    目录 总述 01 10天 基本语法 11 20天 线性数据结构 21 30天 树与二叉树 31 40天 图 41 50天 查找与排序 51 60天 kNN 与 NB 61 70天 决策树与集成学习 71 80天 BP 神经网络 81 90天
  • Box2D C++教程6-定制器(Fixtures)

    Box2D C 教程6 定制器 Fixtures 时间 2012 09 01 17 10 24 CSDN博客 原文 http blog csdn net wen294299195 article details 7932770 Box2D
  • Jetbrains IntelliJ IDEA破解方法

    IntelliJ IDEA 一套智慧型的Java整合开发工具 PHPStorm PHP 集成开发工具 PyCharm 智能Python集成开发工具 RubyMine RubyMine 是一个为Ruby 和Rails开发者准备的IDE Web
  • ActivityManagerService新加listener及触发其回调

    ActivityManagerService新加listener及触发其回调 前言 Android mk ActivityManager java ActivityManagerNative java IActivityManager ja
  • 汇编语言rep movsd

    汇编语言rep movsd rep movsd 一般为 mov esi offset s1 mov edi offset s2 mov ecx 数 cld rep movsd 查找了几个资料 都说得不怎么完整 也许是我知道的太少了 所以觉得
  • 区块链学习1:Merkle树(默克尔树)和Merkle根

    前往老猿Python博文目录 一 简介 默克尔树 Merkle tree MT 又翻译为梅克尔树 是一种哈希二叉树 树的根就是Merkle根 关于Merkle树老猿推荐大家阅读 Merkle树 这篇文章 Merkle树和Merkle根在区块
  • 网络数据传输流程

    目录 一 局域网传输流程 1 集线器 2 交换机 3 交换机 路由器 二 广域网数据传输流程 主要过程 一 局域网传输流程 1 集线器 主要过程 源主机 从上到下封装 如果知道目的IP主机的MAC地址就直接封装在数据链路层的以太网帧头中 如
  • 多线程实现大批量数据查询

    优化一个系统中的功能 需要通过判断进行多次的查库 查库的性能是单表 条件有索引 public Map
  • PostgreSQL插件-pg_stat_statements-查找最耗费资源的SQL(Top SQL)

    数据库是较大型的应用 对于繁忙的数据库 需要消耗大量的内存 CPU IO 网络资源 SQL 优化是数据库优化的手段之一 而为了达到 SQL 优化的最佳效果 您首先需要了解最消耗资源的 SQL Top SQL 例如 IO 消耗最高的 SQL
  • leetcode之找出相交链表的交点

    题目 编写一个程序 找到两个单链表相交的起始节点 如果相交只会是y型相交 如果不想交就返回空指针 O 1 空间和O n 时间 分析 直接采取暴力二重循环可以求解 但是超过时间限制 一个思路是先找出两个链表长度相差的值 然后一个链表先走相差的
  • 关于DAG共识的调研

    内容目录 前言 why DAG DAG 是什么 常见共识机制 主链DAG共识 朴素DAG 平行链DAG 问题与挑战 这是自己看的一篇综述 参考里面的分类并对现在的一些DAG共识做的简要理解 后面会对一些共识的论文做学习笔记 若有错误之处还请
  • 公开数据集下载地址

    这里写目录标题 一 目标检测 分割数据集 1 COCO 数据集 COCO2014 COCO2017 2 PASCAL VOC数据集 voc2007数据集 voc 2012数据集 二 自动驾驶数据集 1 BDD100K 数据集 2 Nusce
  • STM32单片机示例:多个定时器同步触发启动

    文章目录 前言 基础说明 关键配置与代码 其它补充 示例链接 前言 多个定时器同步触发启动是一种比较实用的功能 这里将对此做个示例说明 基础说明 该示例演示通过一个TIM使能时同步触发使能另一个TIM 本例中使用TIM1作为主机 使用TIM
  • Linux主机测评

    安全计算环境 一 身份鉴别 a 应对登录的用户进行身份标识和身份鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 此项部分符合 在root权限下查看有关用户的配置文件 1 通过etc password检查身份标识 看是否有没有
  • qq windows版客户端0day复现——远程代码执行(七夕小礼物)

    ps 本文章仅用来分享 请勿将文章内的相关技术用于非法目的 请勿将文章内的相关技术用于非法目的 请勿将文章内的相关技术用于非法目的 如有非法行为与本文章作者无任何关系 一切行为以遵守 中华人民共和国网络安全法 为前提 今天hw貌似爆了挺多劲
  • R语言 集成算法(Bagging算法和Adaboot算法)

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 R版本 3 6 1 adaboost包 提供Bagging函数和Adaboot函数 gt setwd G R语言 大三下半年 数据挖掘 R语言实战 gt data read csv
  • 实现登录功能之拦截器和导航守卫的使用

    需求 本次主要通过SpringSecurity jwt vue实现简易的登录Demo 实现的功能 主要写Demo过程中记录关于拦截器和导航守卫的使用 环境 nodejs v14 16 1 vue 2 9 6 npm 6 14 12 webp
  • 【求助】ERROR: No matching distribution found for python-gssapi==0.6.4怎么解决

    Collecting python gssapi 0 6 4 Using cached https pypi tuna tsinghua edu cn packages a4 9e 648b4e85235097edcee561c986f70

随机推荐