设为首页 收藏本站
查看: 864|回复: 0

[经验分享] 【Python旧时笔记 三】Python的字符串对象

[复制链接]

尚未签到

发表于 2017-4-27 11:23:47 | 显示全部楼层 |阅读模式
PyStringObject定义在stringobject.h中,附有不少注释说明。1. PyStringObject实际上是一组字符,以'\0'结尾,且因为有只是长度的变量,所以也可以包含'\0'作为内容。
2. PyStringObject是不可变对象,所以a = "hello"和a = "world"先后执行后,a指向的是不同的对象了。
3. PyStringObject保存了hash值避免重复计算。
4. 采用intern机制来处理相同的字符串对象。


结构体定义如下:
typedefstruct{
PyObject_VAR_HEAD     //不定长对象
longob_shash;//如果还没计算,为-1
intob_sstate;//如果该字符串在interned字典中,则该标志不为0。而且在这种情况下,两个来自interned字典的引用不算进ob_refcnt
charob_sval[1];//用来作为指针指向保存字符串的内存区域,包含ob_size+1个元素
}PyStringObject;


计算哈希值的算法有必要MARK下,以后可以参考使用。
staticlong
string_hash(PyStringObject*a)
{
registerPy_ssize_tlen;
registerunsignedchar*p;
registerlongx;


if(a->ob_shash!=-1)
returna->ob_shash;
len=Py_SIZE(a);
p= (unsignedchar*)a->ob_sval;
x= *p<<7;
while(--len>=0)
x= (1000003*x)^ *p++;
x^=Py_SIZE(a);
if(x==-1)
x= -2;
a->ob_shash=x;
returnx;
}




intern机制是用来确保相同的值的字符串对象只有一个存在,并且使得比较操作可以仅仅通过指针比较来完成。
它实际上是维护了一个字典(dict/map)interned,当字符串被interned时,会查找字典中键的存在,如果没有则放入。
这种方法可以在空间上节省,并不能节省时间,因为要判断是否存在于interned字典中,需要先创建字符串对象,才能去表中查找。
此外,这种方法默认针对Python的关键字、单字符、空串等。
当然,Python也提供了intern()内置函数来缓存用户想要的字符串对象。
缓存hash值以及intern机制为解释器加速了20%。


最后,是关于字符串的连接。
比如:str = str1 + str2 + str3 + str4,由于PyStringObject is immutable,所以会为3个+号执行3次内存的分配和复制
而如果将待连接的字符串放入可迭代对象中,使用string_join(PyStringObject的join操作),就会一次计算所需的总共内存大小,一次分配,然后再全部复制过去。


JasonLee   2011.08.08   0:33

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369935-1-1.html 上篇帖子: 菜鸟也来学python 笔记3 下篇帖子: [Python学习]decorator的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表