Python 3字符串索引查找是O(1)?

时间:2016-12-15 20:42:02

标签: python utf-8

短篇小说:

Python 3是unicode字符串查找O(1)还是O(n)?

长篇故事:

C char数组中字符的索引查找是常量时间O(1),因为我们可以确定地跳转到连续的内存位置:

const char* mystring = "abcdef";
char its_d = mystring[3];

与说法相同:

char its_d = *(mystring + 3);

因为我们知道sizeof(char)是1作为C99,并且由于ASCII,一个字符适合一个字节。

现在,在Python 3中,现在字符串文字是unicode字符串,我们有以下内容:

>>> mystring = 'ab€cd'
>>> len(mystring)
5
>>> mybytes = mystring.encode('utf-8')
>>> len(mybytes)
7
>>> mybytes
b'ab\xe2\x82\xaccd'
>>> mystring[2]
'€'
>>> mybytes[2]
226
>> ord(mystring[2])
8364

UTF-8编码,字节2> 127因此对字符3使用多字节表示。

我不能断定Python字符串中的索引查找不能是O(1),因为字符的多字节表示?这意味着mystring[2]是O(n),并且正在以某种方式执行对存储器阵列的即时解释,以便在索引处找到字符?如果是这样的话,我是否错过了一些说明这一点的相关文件?

我做了一些非常基本的基准但我不能推断出O(n)行为:https://gist.github.com/carlos-jenkins/e3084a07402ccc25dfd0038c9fe284b5

$ python3 lookups.py
Allocating memory...
Go!
String lookup: 0.513942 ms
Bytes lookup : 0.486462 ms

编辑:更新了更好的例子。

1 个答案:

答案 0 :(得分:6)

UTF-8是Python的默认编码。 Python 2和Python 3中都有The internal representation uses fixed-size per-character elements。其中一个结果是按索引访问Python(Unicode)字符串对象中的字符的成本为O(1)。

您提供的代码和结果不会另行说明。您将string转换为UTF-8编码的字节序列,我们都知道UTF-8使用可变长度的代码序列,但没有任何内容代表原始{{1}的内部表示。 }。