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

[经验分享] [笔记]Python的字符串对象

[复制链接]
发表于 2017-5-2 10:39:22 | 显示全部楼层 |阅读模式
PyStringObject定义在stringobject.h中,附有不少注释说明。
1. PyStringObject实际上是一组字符,以'\0'结尾,且因为有只是长度的变量,所以也可以包含'\0'作为内容。

2. PyStringObject是不可变对象,所以a = "hello"和a = "world"先后执行后,a指向的是不同的对象了。

3. PyStringObject保存了hash值避免重复计算。

4. 采用intern机制来处理相同的字符串对象。




结构体定义如下:

typedef struct {
PyObject_VAR_HEAD          //不定长对象
long ob_shash;             //如果还没计算,为-1
int ob_sstate;             //如果该字符串在interned字典中,则该标志不为0。而且在这种情况下,两个来自interned字典的引用不算进ob_refcnt
char ob_sval[1];           //用来作为指针指向保存字符串的内存区域,包含ob_size+1个元素
} PyStringObject;






计算哈希值的算法有必要MARK下,以后可以参考使用。

static long
string_hash(PyStringObject *a)
{
register Py_ssize_t len;
register unsigned char *p;
register long x;
if (a->ob_shash != -1)
return a->ob_shash;
len = Py_SIZE(a);
p = (unsigned char *) 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;
return x;
}










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-372019-1-1.html 上篇帖子: Python open读写文件实现脚本 下篇帖子: 函数代码python—filter, lambda 函数代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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