1.程序内存代码分析
Python对于内存的操作,社区开发了一款比较强大的专门用于检测代码内存使用率,用于
项目代码调优的模块 memory_profile 是一个使用较为简单,并且可视化比较直观的工具
模块,通过 pip 工具安装即可使用.
Pip install memory_profiler |
通过在测试的函数或者类型等前面添加@profile 注解,让内存分析模块可以直接进行代码
运行检测,修改上一节代码如下:
from memory_profiler import profile
@profile
def chg_data_1(x):
x = 12
print("method: {}".format(x))
@profile
def chg_data_2(y):
y.append("hello")
print("method: {}".format(y))
if __name__ == "__main__":
a = 10
chg_data_1(a) # 实际参数传递不可变类型
print("main:", a) # 这里 a 是多少? 10
b = [1,2,3]
chg_data_2(b) # 实际参数传递可变类型
print("main:", b) # 这里的 b 是多少? [1,2,3,’hello’]
代码执行结果如下:
D:\python36\python.exe C:/Users/leeking/PycharmProjects/python/内存分析/demo05.py Line # Mem usage Increment Line Contents
Line # Mem usage Increment Line Contents
|
2.操作符号:is和==的使用
前面看过变量以及对象在内存中的分配和执行情况,那么怎样判断对象和对象之间的关系呢.python中提供了对象比较的操作符 is 和内容操作符 ==, 用于判断对象和对象中的值的情况
A is B : 判断对象A和对象B是否指向同一个内存地址,即是否为同一个对象
A == B : 判断对象A和对象B中的内容是否一致
Ps: 判断一个对象是否属于一个类型可以使用函数 isinstance(A, 类型).
不可变数据类型的数据判断
组合数据类型的数据判断
因为创建的每个组合数据类型的对象都是独立的,所以a is b 的结果是False,但是列表中的值是相同的,所以a == b 的结果是True
自定义数据类型的数据判断
因为自定义数据类型在创建对象时,会在堆内存中单独创建对象,所以 is的判断是False.但是我们使用相同的name值创建的对象在==判断中的结果还是False呢,因为在==判断过程中,会自动调用父类中的__eq__魔法函数进行判断,默认情况下,创建的对象内部变量,使用的是对象自己的内存空间,所以==判断是 False