在运行代码时,我们常常想要知道代码运行内存占用情况。很多情况下我们想知道是不是自己哪个循环写的太繁琐了,或者是在哪一步可以用更小的内存来实现等。所以需要我们对程序整体、某一部分代码、某一变量运行内存使用有更直观的了解。
在本地运行代码如PyCharm和远程运行代码如VScode中都是如何查看内存使用情况的?
内存分析器Memory Profiler
这是一个python模块,用于监控进程的内存消耗以及对python程序的内存消耗进行逐行分析。它是一个纯 python 模块,依赖于psutil模块。
pip 安装:pip install -U memory_profiler
对象
sys.getsizeof()——以字节为单位返回对象的大小。
sys.getsizeof只计算实际使用的内存大小,引用所消耗的内存大小不计算。sys.getsizeof只能作为计算内存大小的参考~
代码及结果
import sys
a = [0,1,2,3,4]*2
memory_a = sys.getsizeof(a)
print("a内存占用:%i字节"%memory_a)
a内存占用:144字节
函数
如果想要对某一函数做性能分析,在需要做性能分析的函数前面加装饰器 @profile
代码及结果
from memory_profiler import profile
import time
@profile # 在需要做性能分析的函数前面加装饰器 @profile
def my_func1(c):
a = [1] * (10 ** c)
b = [2] * (2 * 10 ** 7)
time.sleep(5)
del b
del a
print("+++++++++")
def my_func2():
p = [0,1,2,3,4,5]
P = p*2
print(P)
if __name__ == '__main__':
c=6
my_func1(c)
my_func2()
+++++++++
Filename: E:/平时笔记/test/memory_test.py
Line Mem usage Increment Occurrences Line Contents
4 36.4 MiB 36.4 MiB 1 @profile # 在需要做性能分析的函数前面加装饰器 @profile
5
6 def my_func1(c):
7 44.1 MiB 7.6 MiB 1 a = [1] * (10 ** c)
8 196.7 MiB 152.6 MiB 1 b = [2] * (2 * 10 ** 7)
9 196.7 MiB 0.0 MiB 1 time.sleep(5)
10 44.1 MiB -152.6 MiB 1 del b
11 36.4 MiB -7.6 MiB 1 del a
12 36.4 MiB 0.0 MiB 1 print("+++++++++")
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
如果想要将函数性能分析的结果保存到文件方便查看,可直接用
@profile(precision=4, stream=open("memory_profiler.log", "w+"))
结果解读
列名 | 含义 |
---|---|
Mem usage | 内存占用情况 |
Increment | 执行该行代码后新增的内存 |
Occurences | 执行次数 |
Line Contents | 行内容 |
程序整体基于时间的内存使用
mprof使用
命令 | 含义 |
---|---|
mprof run | 运行可执行文件,记录内存使用情况 |
mprof plot | 绘制一个记录的内存使用情况(默认情况下,最后一个) |
mprof list | 以用户友好的方式列出所有记录的内存使用情况文件 |
mprof clean | 删除所有记录的内存使用情况文件 |
mprof rm | 删除特定记录的内存使用情况文件 |
代码及结果
import time
def my_func1(c):
a = [1] * (10 ** c)
b = [2] * (2 * 10 ** 7)
time.sleep(5)
del b
del a
print("+++++++++")
def my_func2():
time.sleep(5)
p = [0,1,2,3,4,5]
P = p*2
print(P)
if __name__ == '__main__':
c=6
my_func1(c)
my_func2()
在PyCharm的终端(Terminal)输入:
mprof run memory_test.py
+++++++++
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
mprof plot
python查看内存使用
import psutil
import os
info = psutil.virtual_memory()
print(u'内存使用:',psutil.Process(os.getpid()).memory_info().rss)
print(u'总内存:',info.total)
print(u'内存占比:',info.percent)
print(u'cpu个数:',psutil.cpu_count())