Python程序运行内存的查看

在运行代码时,我们常常想要知道代码运行内存占用情况。很多情况下我们想知道是不是自己哪个循环写的太繁琐了,或者是在哪一步可以用更小的内存来实现等。所以需要我们对程序整体、某一部分代码、某一变量运行内存使用有更直观的了解。

在本地运行代码如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())

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python程序运行内存的查看 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日
合作推广
合作推广
分享本页
返回顶部