python--intern机制

一、引用计数

1、概述

要保持追踪内存中的对象,Python使用了引用计数这一简单的技术。

2、引用计数的增减

2.1 增加引用计数

当对象被创建并(将其引用)赋值给变量时,该对象的引用计数被设置为1。
对象的引用计数增加的情况:
对象被创建:x = 3.14
另外的别名被创建:y = x
被作为参数传递给函数(新的本地引用):foobar(x)
成为容器对象的一个元素:myList = [123, x, ‘xyz’]

2.2 减少引用计数

对象的引用计数减少的情况:
一个本地引用离开了其作用范围。如foobar()函数结束时
对象的别名被显式销毁:del y
对象的一个别名被赋值给其他对象:x = 123
对象被从一个窗口对象中移除:myList.remove(x)
窗口对象本身被销毁:del myList

2.3 del语句

Del语句会删除对象的一个引用,它的语法如下:del obj[, obj2[, …objN]]
例如,在上例中执行del y会产生两个结果:
从现在的名称空间中删除y
x的引用计数减1

二、小整数对象池与字符串的intern机制

1、整数

Python里一切都是对象.所以1,2,3,4…这些整数也都是对象。这些基本的不可变对象在python里会被频繁的引用,创建,如果不找到好的办法的话很容易让python引发效率瓶颈,所以python引入了整数对象池的机制(参考intobject.c中代码片段)
代码段中,清楚写了[-5, 256) 这些小整数被定义在了这个对象池里.所以当引用小整数时会自动引用整数对象池里的对象

2、字符串

字符串对象也是不可变对象,python有个intern机制,简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。

3、其它类型

float类型可以认为每个赋值都是创建一个对象,因为float有点多,所以没必要和int一样了.
tuple它是不可变对象,理应和int和string一样会做一个缓存,但是,tuple的数据结构很简单,简单到不能再简单,就是一个数组,里面是元组的迭代对象,这个对象指向的是各个元素.最关键的是元组没有实现intern机制

4、原因:空间效率和时间效率的妥协

相比于数字,string本身参与的运算要少很多,而且string本身占据的空间也大许多,因此string的主要问题在于不共享带来的空间浪费,所以string实现了很费时间的intern操作。
对于数字情况正好相反。作为一个数字,需要做的运算要比string多太多了,而且大小比string也小很多。如果在计算10000+20000之前先花好久查找重复对象,导致一个1ms完成的加法花了100ms。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值