在阅读雨痕的python学习笔记第二版中有这样一段话,并没有更多的解释,搜索之后也没有更多相关的资料。个人感觉是对应字符串对象的一些属性进行修改或者精简,想请教一下大家XD~
认证高级PHP讲师
一般来说池化是一种预分配的机制,比如内存池、线程池等,都是为了减少在运行期间频繁申请资源造成的开销,但这个里面明显不是这个意思,起码从上下文里看,笔记中的池化分别指的是2个不同的意思,一个是类的属性,一个是常量资源的内存布局。1) __name__和__doc__这个指的应该是这些属性属于类的属性,而非实例化后的对象的属性,比如
from PyQt4.QtCore import * print QString.__doc__ a = QString("hello") print a.__doc__
这里使用QString这个类即可索引到对应的__doc__,每个实例化后的对象也可以访问这个属性,但明显数据存放在类中由所有实例化后的对象共享更节省资源。
2) 个人觉得intern这个例子举得不太好,这个intern应该是来自java的String的一个方法(或者是当初java参考了python引入的,至于谁先谁后,无从考究),见
http://blog.sina.com.cn/s/blog_69dcd5ed0...
python里面用id()来标记每个对象的地址信息,所以,如果2个对象的id()不一样的话,表示在内存布局上,这2个对象的内存地址是不一样的(但其内容可能相同)。所以,为了使具有相同内容的对象引用的内存空间是一样的话,使用intern关键字处理下,可以达到这个目的,进而节省内存,见下面例子
b = "abc" a = "".join(["a", "b", "c"]) print a == b # 内容是一致的,b是直接引用一个字符串常量,但a是经过计算后、也就是在运行的过程中生成的 print id(a) == id(b) #但是id不一样 a = intern(a) #使用intern处理下,id一样了 print id(a) == id(b)
推荐看下 Python源码剖析对象池作为在Python内部被大量使用的技术,直接看源码的话会有更清晰的理解。
简单来说就是-128到正127范围的int值全局唯一,不管程序读写多少次,这些常用对象由python解释器维持引用,达到节省内存的效果,不同类型有不同的池子,字符串的话一般会把常用的单字符等放在池子里,intern就是对池子的一种操作接口。
一般来说池化是一种预分配的机制,比如内存池、线程池等,都是为了减少在运行期间频繁申请资源造成的开销,但这个里面明显不是这个意思,起码从上下文里看,笔记中的池化分别指的是2个不同的意思,一个是类的属性,一个是常量资源的内存布局。
1) __name__和__doc__这个指的应该是这些属性属于类的属性,而非实例化后的对象的属性,比如
这里使用QString这个类即可索引到对应的__doc__,每个实例化后的对象也可以访问这个属性,但明显数据存放在类中由所有实例化后的对象共享更节省资源。
2) 个人觉得intern这个例子举得不太好,这个intern应该是来自java的String的一个方法(或者是当初java参考了python引入的,至于谁先谁后,无从考究),见
python里面用id()来标记每个对象的地址信息,所以,如果2个对象的id()不一样的话,表示在内存布局上,这2个对象的内存地址是不一样的(但其内容可能相同)。所以,为了使具有相同内容的对象引用的内存空间是一样的话,使用intern关键字处理下,可以达到这个目的,进而节省内存,见下面例子
推荐看下 Python源码剖析
对象池作为在Python内部被大量使用的技术,直接看源码的话会有更清晰的理解。
简单来说就是-128到正127范围的int值全局唯一,不管程序读写多少次,这些常用对象由python解释器维持引用,达到节省内存的效果,不同类型有不同的池子,字符串的话一般会把常用的单字符等放在池子里,intern就是对池子的一种操作接口。