python内存优化之垃圾回收

关于垃圾回收

在python中,为了优化性能,自身存在着垃圾回收(Garbage Collect, GC)机制,一般不需要认为干涉,它会自动执行内存垃圾回收,回收通常发生于变量(对象)的引用计数为0时。

引用计数
查看变量的引用计数

>>> x10 = "cdsaa123kkkkkk"
>>> print(sys.getrefcount(x10))
2

这里需要注意,一些小的整数如(-5,255)范围的,由于存在小整数池,所以对变量赋值在该范围时,得到的引用计数是不准确的。

查看对象引用关系图

import objgraph # 第三方库,需要安装 pip install objgraph

a = [1, 2, 3]
b = [4, 5, 6]

a.append(b)
b.append(a)

objgraph.show_refs([a]) #下面为返回信息:图形保存在下面的两个文件中
Graph written to C:\Users\ADMINI~1\AppData\Local\Temp\objgraph-41n90ott.dot (8 nodes)
Graph viewer (xdot) not found, generating a png instead
Image generated as C:\Users\ADMINI~1\AppData\Local\Temp\objgraph-41n90ott.png

图内容如下:
python内存优化之垃圾回收_第1张图片

手动回收
1、删除变量

>>> del x10
>>> print(sys.getrefcount(x10))
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'x10' is not defined

2、修改作用域
在函数内定义的变量作用域在函数内,是局部变量,通常随着函数执行完毕而释放内存(变量相互引用除外)。

变量相互引用

def tt():
    a = [1, 2, 3]
    b = [4, 5, 6]
    a.append(b)
    b.append(a)

3、对函数返回值不做接收

>>> def z():
...     a = [i**2 for i in range(1000000)]
...     return a
...
>>>z()

4、借助gc模块

import gc

gc.collect()

python占用内存大小的查看

这里的查看方法指适用于linux系统,windows不支持。

import os
import psutil

# 查看当前 python 程序占用的内存大小
def show_memory_info(hint):
    pid = os.getpid() #获取进程 pid
    p = psutil.Process(pid) #获取进程
    info = p.memory_full_info() # #获取进程的内存信息
    memory = info.uss / 1024. / 1024 # 占用内存字节数转化为M单位
    print('{} memory used: {} MB'.format(hint, memory))

def func():
    show_memory_info('initial')  
    # 测试改变作用域
    #global a
    a = [i for i in range(10000000)]
    show_memory_info('after a created') 
    # 测试不接收返回值
    #return a

func()
show_memory_info('finished')  

你可能感兴趣的:(基础知识)