python内存机制

python内存机制

1、对象在内存的存储

1 )、数字存储

a = 100
b = 100

以上代码是一个简单的赋值语句,将常量100赋值给变量a、b。在python内存机制中,100称为一个对象,而a、b为对象的引用。如何知道该赋值语句是否创建了2个对象,这时可以使用python内置函数id()和关键字is。id()用于返回对象的内存地址,is用于判断两个引用所指的对象是否相同。

print(id(a))  # 返回对象的内存地址
print(id(b))  
print(a is b)
# 输出:

# 1512471104
# 1512471104
# True

# Process finished with exit code 0

返回到控制台的数据说明:a、b的内存地址是一样的,所以a、b引用指向的是同一个对象。

2)、简短的字符串存储

a = "Hello world"
b = "Hello world"
print(id(a))
print(id(b))
print(a is b)

# 结果:
# 1388045640112
# 1388045640112
# True

# Process finished with exit code 0

可见,python存储简短的字符串与整数类型存储一致的,创建一个字符串对象”Hello world”,a、b是两个引用,引用的是同一个对象。

3)、列表/字典存储

a = []
b = []
print(id(a))
print(id(b))
print(a is b)
# 结果:
# 2906693242632
# 2906692073992
# False

# Process finished with exit code 0
a = dict(name='八岐大蛇',
             age=1000,
             sex='男',
             addr='东方',
             enemy=['八神', '草薙京', '神乐千鹤'])
b = dict(name='八岐大蛇',
             age=1000,
             sex='男',
             addr='东方',
             enemy=['八神', '草薙京', '神乐千鹤'])
print(id(a))
print(id(b))
print(a is b)
# 结果:
# 2906693242632
# 2906692073992
# False

# Process finished with exit code 0

列表和字典对象在内存中会创建两个不同的对象,这个时候引用a和b引用各自的对象。
结合简短的字符串、数字存储的运行结果。可以看到,Python缓存了整数和短字符串,因此每个对象只存有一份,使用赋值语句,也只是创造了新的引用,而不是对象本身。列表和字典对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。

2、减少引用

减少某个对象的引用计数可以使用pop()删除。getrefcount()可以查看某个对象的引用计数。
注意:当使用某个引用作为参数,传递给getrefcount()时,会创建了一个临时的引用。所以,getrefcount()所得到的结果,会比正常的多1个。

from sys import getrefcount

a = [100, 200]
b = [a, a, a, a, a, a]
print(getrefcount(a))
b.pop()
print(getrefcount(a))

# 结果:
# 8
# 7

# Process finished with exit code 0

3、垃圾回收

python引用的计数器会追踪创建了多少个新的对象和有多少对象的引用,随着对象越来越多,它们将占据越来越大的存储空间。当达到某个时候,内存开始进行垃圾回收,销毁引用计数器为0的对象,避免引用计数消耗更多的资源。

4、分代回收

分代回收:垃圾回收了很多次后,有些对象依然存在,那么这样的对象不需要经常回收,python会减少在垃圾回收中扫描它们的频率。
分代回收分为0、1、2三代,每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值