① 使用 sys.getsizeof 查看 python 对象的内存占用
使用 sys.getsizeof 方法可以查看 python 对象的内存占用,单位:字节 (byte)
实际上是调用了 __sizeof__ 方法:
有些派唤数据类型告羡谈在 Python3 和 Python2 中占用的内存是不同的,例如 range :
关于这个值是怎么算出来的,有待研究~
暂时已知:这个值包括该对象的数值、签名(包括数据类型、参数、调用方式等)等一系列数据所占总内存。可变对象所占内存可能极小,因为对象是袜碰指针,指向很大的数据。
② 一张图片所占内存是如何计算的
Bitmap.Config 表示图片像素类型,包括ALPHA_8、RGB_565、ARGB_4444、ARGB_8888
其中 A表示透明度;RGB分别是Red、Green、Blue,三种原色
1.在不考虑屏幕分辨率和res文件夹分辨率的情况下:
一张图片(BitMap)占用的内存=长 * 宽 * 每个像素点的大小
例如:一张图片宽1080 ,高 452
那么,这张图片的大小按照这个公式应该是:1080 * 452 * 4B = 1952640B ≈ 1.86MB
2.考虑屏幕分辨率和res文件夹分辨率的情况下:
系统在加载 res 目录下的资源图片时,会根据图片存放的不同目录做一次分辨率的转换。
新长 = 原长 * (设备的 dpi / 目录对应的 dpi )
新宽 = 原宽 * (设备的 dpi / 目录对应的 dpi )
一张图片(BitMap)占用的内存= 新长 * 新宽 * 每个像素点的大小
③ 如何释放Python占用的内存
1.充分利用内存
任何一种图像处理软件对内存的要求都很高,Photoshop也一样。如果你在使用Photoshop时,没有使用其它的一些大软件,这时你就可以将Photoshop占用内存资源的比例提高。方法是:进行Photoshop,选择菜单下File\Preference\Memory & Image Cache命令,将Used by Photoshop的比例提高到80%~90%即可。
2.指定虚拟内存
在处理Photoshop时,内存被用完是很正常的,到时会大大影响Photoshop处理图像的时间,哪将怎么解决呢?方法是:你可以用硬盘来作为内存来使用,也就是常说的虚拟内存。请选择菜单下“File\Preference\Plug-Ins & Scratch Disks”命令。在这里的Scratch Disks下,你可以在硬盘上指定四个驱动器来作为虚拟内存,软件默认的虚拟内存是在Windows\temp之下。当第一个虚拟内存被使用光之后,Photoshop会自动去使用第二个Scratch Dsik,这样就提高了执行速度。
3.释放内存与硬盘空间
在进行图像处理时,你所进行的所有操作将会记录在Photoshop的History(历史记录)工作板中。这些操作包括:复制到Clipboard(粘贴板)、Undo(恢复)、Pattern(填充物)、Histories(记录)等几种,选择菜单下“Edit\Purge”命令。
进行这些操作之后,Photoshop会将这些图像和数据保存在内存里,使用该命令后,即将这些被占用的内存空间释放出来(RAM:Oh! Freeden)这样就让Photoshop有更多的Resource(资源)可用,自然就提高了效率。但注意,如果这些操作占用的内存比较少时,就没有必要使用啦!
除此之外,在处理大型图片时,Photoshop会自动产生一些临时文件,一般都很大,如果你处理的是一个20MB大小的宣传画时,那么临时文件可能就是100~150MB。请在Windows\temp或在你设定虚拟内存的驱动器里,将产生的Photoshop临时文件*.tmp删除掉。
④ 7种检测Python程序运行时间、CPU和内存占用的方法
1. 使用装饰器来衡量函数执行时间
有一个简单方法,那就是定义一个装饰器来测量函数的执行时间,并输出结果:
import time
from functoolsimport wraps
import random
def fn_timer(function):
@wraps(function)
def function_timer(*args, **kwargs):
t0= time.time()
result= function(*args, **kwargs)
t1= time.time()
print("Total time running %s: %s seconds" %
(function.__name__, str(t1- t0))
)
return result
return function_timer
@fn_timer
def random_sort(n):
return sorted([random.random() for i in range(n)])
if __name__== "__main__":
random_sort(2000000)
输出:Total time running random_sort: 0.6598007678985596 seconds
使用方式的话,就是在要监控的函数定义上面加上 @fn_timer 就行了
或者
# 可监控程序运行时间
import time
import random
def clock(func):
def wrapper(*args, **kwargs):
start_time= time.time()
result= func(*args, **kwargs)
end_time= time.time()
print("共耗时: %s秒" % round(end_time- start_time, 5))
return result
return wrapper
@clock
def random_sort(n):
return sorted([random.random() for i in range(n)])
if __name__== "__main__":
random_sort(2000000)
输出结果:共耗时: 0.65634秒
2. 使用timeit模块
另一种方法是使用timeit模块,用来计算平均时间消耗。
执行下面的脚本可以运行该模块。
这里的timing_functions是Python脚本文件名称。
在输出的末尾,可以看到以下结果:4 loops, best of 5: 2.08 sec per loop
这表示测试了4次,平均每次测试重复5次,最好的测试结果是2.08秒。
如果不指定测试或重复次数,默认值为10次测试,每次重复5次。
3. 使用Unix系统中的time命令
然而,装饰器和timeit都是基于Python的。在外部环境测试Python时,unix time实用工具就非常有用。
运行time实用工具:
输出结果为:
Total time running random_sort: 1.3931210041 seconds
real 1.49
user 1.40
sys 0.08
第一行来自预定义的装饰器,其他三行为:
real表示的是执行脚本的总时间
user表示的是执行脚本消耗的CPU时间。
sys表示的是执行内核函数消耗的时间。
注意:根据维基网络的定义,内核是一个计算机程序,用来管理软件的输入输出,并将其翻译成CPU和其他计算机中的电子设备能够执行的数据处理指令。
因此,Real执行时间和User+Sys执行时间的差就是消耗在输入/输出和系统执行其他任务时消耗的时间。
4. 使用cProfile模块
5. 使用line_profiler模块
6. 使用memory_profiler模块
7. 使用guppy包
⑤ Python如何获取图片长宽等信息
使用PIL模块,windows安装包下载:
http://www.pythonware.com/procts/pil/
使用方法
#coding:utf8
#获取指定图片的长和宽
fromPILimportImage
img=Image.open("img.jpg")
printimg.size
运行结果:
(52,54)
⑥ Python如何获取图片长宽等信息
获取图片的长,宽,需要了解你的图像文件,图片文件的头部都是定义好的可以直接读取,比附bmp格式的直接可以去读它对应的第几个字节,那就是长宽信息。
⑦ python*如何获取pcie占用
1、首先需要导入psutil模块。
2、然后使用【mem.used】调用方法并返回浮点数类型即可获取系统内存占用信息。
⑧ python如何查看内存占用空间
利用psutil模块,如果没有直接 pip installpsutil
info=psutil.virtual_memory()
printu'内存使用:',psutil.Process(os.getpid()).memory_info().rss
printu'总内存:',info.total
printu'内存占比:',info.percent
printu'cpu个数:',psutil.cpu_count()
⑨ python 内存占用分析工具
pip install memory_profiler
pip install psutil
pip install matplotlib
使用方法
from memory_profiler import profile
@profile(precision=4, stream=open('test.log', 'w+'))
def test(args: List):
...
运行:
python3 test.py
Mem usage:表示执行该行后Python解释器的内存使用情况
Increment:表示当前行的内存相对于上一行的差异,即自己本身增长了多少,如果减少了则不显示.
⑩ python 如何计算一个数组所占的内存
list类似于 Vector
对象和指针数组是分开分配的,数组是在堆上。指针数组的大小是动态分配的,分配的内存肯定要多于实际的。既然是动态分配的,那么realloc调整大小就会移动数据,复制数据,大量数据还是用链表比较好。
dict类似于 Hash table
字典本身默认有元素容量,不够的才去堆上分配。需要扩容或者收缩,就会动态重新分配内存,重新hash。dict的keys()等调用生成list 如果数量很大,建议用迭代器。