短篇小说:
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
编辑:更新了更好的例子。
答案 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}的内部表示。 }。