python计算非内置数据类型占用内存

简介:

getsizeof的局限

python非内置数据类型的对象无法用sys.getsizeof()获得真实的大小,例:

复制代码
import networkx as nx
import sys
G = nx.Graph()
l = [i for i in xrange(10000)]
print "size of l:", sys.getsizeof(l)
G.add_nodes_from(l)
print "size of graph:", sys.getsizeof(G)
复制代码

结果

size of l: 87632
size of graph: 64

分析

图graph中包含点序列l,而大小还不如l的大小,所以用getsizeof计算python的非内置类型的对象大小时是不准的。

使用psutil模块获取内存

例1:

复制代码
import networkx as nx
import psutil
import sys
import os
G = nx.Graph()
l = [i for i in xrange(10000)]
print "size of l:", sys.getsizeof(l)
G.add_nodes_from(l)
print "size of graph:", sys.getsizeof(G)
process = psutil.Process(os.getpid())
max_mem = process.memory_info().rss
print 'max_mem:', max_mem
复制代码

这样得到的有问题,需要把一开始系统所占的内存去掉

复制代码
import psutil
import sys
import os

process = psutil.Process(os.getpid())

max_mem_1 = process.memory_info().rss
print 'max_mem:', max_mem_1

G = nx.Graph()
l = [i for i in xrange(10000)]
G.add_nodes_from(l)

max_mem_2 = process.memory_info().rss
print 'max_2:', max_mem_2
print 'max_mem:', max_mem_2 - max_mem_1
复制代码

结果

max_mem: 23724032
max_2: 31637504
max_mem: 7913472

例2:

复制代码
import psutil
import os
import sys
from datetime import datetime

process = psutil.Process(os.getpid())

max_mem_1 = process.memory_info().rss / 1024.0 / 1024.0 / 1024.0
print 'max_mem 1:', max_mem_1

all_road_nx = 'a' * 1024 * 1024 * 1024 * 10;
print 'size:', sys.getsizeof(all_road_nx)/ 1024.0 / 1024.0 / 1024.0
print 'len all_road_nx:', len(all_road_nx)


max_mem_2 = process.memory_info().rss / 1024.0 / 1024.0 / 1024.0
print 'max_mem 2:', max_mem_2

print 'max_mem 3:', max_mem_2 - max_mem_1
复制代码

结果:

复制代码
max_mem 1: 0.00862503051758
size: 10.0000000345
len all_road_nx: 10737418240
max_mem 2: 10.0086517334
max_mem 3: 10.0000267029
复制代码

python模块psutil简介

psutil提供了个接口,可以用来获取信息,包括:

  • 当前运行的进程
  • 系统(资源使用)信息
  • CPU
  • 内存
  • 磁盘
  • 网络
  • 用户

psutil实现了很多功能,包括了如下工具所具有的:

  • ps
  • top
  • df
  • kill
  • free
  • lsof
  • free
  • netstat
  • ifconfig
  • nice
  • ionice
  • iostat
  • iotop
  • uptime
  • pidof
  • tty
  • who
  • taskset
  • pmap

psutil获取系统状态举例

复制代码
#! coding:utf-8
import networkx as nx
import psutil
import sys
import os

p = psutil.Process(os.getpid())

psutil.pids()  #查看系统全部进程
p = psutil.Process(6241)  #查看系统全部进程
print "name:", p.name()   #进程名
print "bin 路径", p.exe()    #进程的bin路径
print "进程绝对路径", p.cwd()    #进程的工作目录绝对路径
print "进程状态", p.status()   #进程状态
print "进程创建时间", p.create_time()  #进程创建时间
print "进程uuid信息", p.uids()    #进程uid信息
print "进程gid信息", p.gids()    #进程的gid信息
print "进程的cpu时间信息", p.cpu_times()   #进程的cpu时间信息,包括user,system两个cpu信息
print "get进程cpu亲和度", p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
print "进程内存利用率", p.memory_percent()  #进程内存利用率
print "进程内存rss,vms信息", p.memory_info()    #进程内存rss,vms信息
print "进程的IO信息", p.io_counters()    #进程的IO信息,包括读写IO数字及参数
print "进程列表", p.connections()   #返回进程列表
print "进程开启的线程数", p.num_threads()  #进程开启的线程数
复制代码

结果

复制代码
name: python
bin 路径 /home/tops/bin/python2.7
进程绝对路径 /home/jihite/iu_iso_test
进程状态 sleeping
进程创建时间 1463322002.74
进程uuid信息 puids(real=124674, effective=124674, saved=124674)
进程gid信息 pgids(real=100, effective=100, saved=100)
进程的cpu时间信息 pcputimes(user=14.38, system=2.38, children_user=0.0, children_system=0.0)
get进程cpu亲和度 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
进程内存利用率 0.0432284208934
进程内存rss,vms信息 pmem(rss=58548224, vms=534482944, shared=6922240, text=1536000, lib=0, data=268894208, dirty=0)
进程的IO信息 pio(read_count=4166, write_count=1192, read_bytes=0, write_bytes=0)
进程列表 [pconn(fd=3, family=2, type=1, laddr=('10.184.70.11', 57785), raddr=('10.184.70.13', 8018), status='ESTABLISHED')]
进程开启的线程数 4
复制代码

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/5491705.html,如需转载请自行联系原作者

相关文章
|
10天前
|
Python
Python中Cp、Cpk、Pp、Ppk的计算与应用
总的来说,Cp、Cpk、Pp、Ppk是衡量过程能力的重要工具,它们可以帮助我们了解和改进生产过程,提高产品质量。
50 13
|
4天前
|
存储 程序员 Python
Python 变量和简单数据类型
本文介绍了 Python 编程的基础知识,从创建第一个 Python 文件 `hello_world.py` 开始,讲解了 Python 文件的运行机制及解释器的作用。接着深入探讨了变量的定义、命名规则和使用方法,并通过示例说明如何修改变量值。同时,文章详细解析了字符串的操作,包括大小写转换、变量插入及空白字符处理等技巧。此外,还涵盖了数字运算(整数与浮点数)、常量定义以及注释的使用。最后引用了《Python 之禅》,强调代码设计的美学原则和哲学思想。适合初学者快速掌握 Python 基础语法和编程理念。
|
24天前
|
Python
探索Python的各式数据类型
以上就是Python数据类型的一次简单而有趣的游览。和她继续接触,你会发现她还有更多有趣的面象,例如集合里的冰冻集合(Frozenset),序列里的字符串(String)和字节序列(Bytes)等等。希望这次游览能对你有所启发,让你更好地理解和使用Python。
44 21
|
13天前
|
存储 人工智能 算法
使用Python计算从位置x到y的最少步数
本文通过Python代码结合广度优先搜索(BFS)算法,解决从起点到终点的最少步数问题。以二维网格为例,机器人只能上下左右移动,目标是最短路径。BFS按层遍历,确保首次到达终点即为最短路径。文中提供完整Python实现,包括队列与访问标记数组的使用,并输出示例结果。此外,还探讨了双向BFS、Dijkstra及A*算法等优化方法,帮助读者深入理解最短路径问题及其高效解决方案。
41 0
|
2月前
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
92 1
|
5月前
|
Python
Python中不同数据类型之间如何进行转换?
Python中不同数据类型之间如何进行转换?
140 62
|
5月前
|
存储 开发者 Python
Python 的数据类型
Python 的数据类型
150 61
|
4月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
103 18
|
4月前
|
Python
Python 中一些常见的数据类型
Python 中一些常见的数据类型
286 8
|
4月前
|
Python
使用Python计算字符串的SHA-256散列值
使用Python计算字符串的SHA-256散列值
123 7

热门文章

最新文章

下一篇
oss创建bucket