一、查看内存消耗
(一) tracemalloc.start()
import tracemalloc
"""
跟踪内存消耗
"""
tracemalloc.start() # 开始跟踪
# pla_1 = [Player(1,2,3) for _ in range(10000)] # size=1726 KiB __dict__
pla_2 = [Player2(1, 2, 3) for _ in range(10000)] # size=711 KiB
snapshot = tracemalloc.take_snapshot() # 快照 当前内存分配
top = snapshot.statistics("filename") # 快照对象统计 监测文件
for start in top[:10]:
print(start)
(二)psutil
import os
import psutil
def show_info(start):
# 获取当前进程id
pid = os.getpid()
# 获取当前堆成对象
p = psutil.Process(pid)
# 返回该对象的内存消耗
info = p.memory_full_info()
# 获取进程独自占用的物理内存 换算单位 MB
memory = info.uss/1024./1024
print(f"{start}一共占用{memory:.2f}MB")
def func():
show_info("initial")
# 因为a是局部变量 局部变量在函数执行完毕 引用就会注销
a = [i for i in range(1000000)] # 列表推导式 [0~9999999]
show_info("created")
二 提升性能
(一)__new__单例模式
定义
- __new__是用来创建并返回对象,所以我们可以利用它来修改创建对象的行为
实现前提
- 重写 __new__方法
- 要对object基类自带的__new__函数进行修改,使其不会每次实例化都会自动创建一个对象
- __new__比__init__先执行,只有对象创建了,才会自动调用初始化方法
- 必须用return将对象返回出来
- 要继承父类,因为我们重写只是增加部分功能,真正创建对象的代码复杂,不是写一个函数定义就能创建的,复杂的也不需要我们重写,直接继承基类自带的继承功能就行
实现
- 对自动创建对象的__new__魔法方法进行重写
- 添加条件语句:
当对象不存在时,创建对象
当对象存在时,永远返回当前已经创建对象 - 继承<
- 添加条件语句: