李成笔记网

专注域名、站长SEO知识分享与实战技巧

CPython源码阅读15-字符串对象为何unicode命名

这篇文章开始我们来学习一下python中的字符串,同时查看一下Cpython中字符串对象及类型对象和方法在底层的实现。CPython中字符串对象结构体为PyUnicodeObject,为什么要用unicode来命名。回想一下前边的一篇文章,ASCII编码,一个字节,英文字符可以表示;随着中文等语言的出现,一个字符已经不能表示这么多字符,Unicode使用最多可以达到4个字节来表示一个字符;同时会出现一个问题,一个英文符号使用一个字节就够了,没必要采用四个字节,utf-8编码提供了一个新的编码规则,具有可变长的功能。

那问题就来了,不同类型的字符都使用unicode来编码的话,每个字符最大可以占到四个字符。从内存角度来说,这种编码消耗比较严重。CPython内部使用了三种编码方式来表示Unicode。

        Py_UCS1 *latin1;  编码:每个字符一个字节
        Py_UCS2 *ucs2;    编码:每个字符两个字节
        Py_UCS4 *ucs4;    编码:每个字符四个个字节

那问题又来了,干脆采用utf-8编码不就行了,省得对unicode进行三种编码。utf-8对于不同的字符采用不同的编码方式,通过索引查找字符串中指定的字符时,时间复杂度就不为O(1)。CPython使用unicode提供的三种编码方式,原理是这样的。在创建字符串时,会先扫描,先尝试占用字节数最少的Latin1编码存储;如果发现存储不下的字符,只能改变编码,使用UCS2;如果又发现了新的字符,这个字符UCS2也无法存储,再次改变编码,使用UCS4进行存储。

一但改变编码,字符串中所有字符都会使用同样的编码。这样通过索引查找字符串中指定的字符时,时间复杂度就为O(1)。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言