什么';是Python的运行时';s strip()?
Python的strip()的运行时是什么 因为remove是O(n)表示单个字符,strip是O(n^2)表示字符串吗?它也只是O(n)而已。引用与带空格的普通什么';是Python的运行时';s strip()?,python,python-2.7,python-internals,Python,Python 2.7,Python Internals,Python的strip()的运行时是什么 因为remove是O(n)表示单个字符,strip是O(n^2)表示字符串吗?它也只是O(n)而已。引用与带空格的普通条带对应的代码 但另一方面,它有点复杂,但相当相似 Py_LOCAL_INLINE(PyObject *) do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj) { char *s = PyString_AS_STRING(self); Py_s
条带
对应的代码
但另一方面,它有点复杂,但相当相似
Py_LOCAL_INLINE(PyObject *)
do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj)
{
char *s = PyString_AS_STRING(self);
Py_ssize_t len = PyString_GET_SIZE(self);
char *sep = PyString_AS_STRING(sepobj);
Py_ssize_t seplen = PyString_GET_SIZE(sepobj);
Py_ssize_t i, j;
i = 0;
if (striptype != RIGHTSTRIP) {
while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) {
i++;
}
}
j = len;
if (striptype != LEFTSTRIP) {
do {
j--;
} while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen));
j++;
}
if (i == 0 && j == len && PyString_CheckExact(self)) {
Py_INCREF(self);
return (PyObject*)self;
}
else
return PyString_FromStringAndSize(s+i, j-i);
}
Py\u LOCAL\u INLINE(PyObject*)
Doxstrip(PyStringObject*self,int-striptype,PyObject*sepobj)
{
char*s=PyString作为字符串(self);
Py_ssize_t len=PyString_GET_SIZE(self);
char*sep=PyString作为字符串(sepobj);
Py_ssize_t seplen=PyString_GET_SIZE(sepobj);
Py_ssize_t i,j;
i=0;
如果(striptype!=RIGHTSTRIP){
而(i=i&&memchr(sep,Py_-CHARMASK(s[j]),seplen));
j++;
}
如果(i==0&&j==len&&PyString\u CheckExact(self)){
Py_增量(自我);
返回(PyObject*)self;
}
其他的
从stringandsize(s+i,j-i)返回PyString_;
}
它与前一个相同,但它有额外的memchr(sep,Py_CHARMASK(s[j]),seplen)
每次检查。因此,此操作的时间复杂度变为O(N*M),其中M
是要剥离的实际字符串的长度。它也仅为O(N)。引用与带空格的普通条带
对应的代码
但另一方面,它有点复杂,但相当相似
Py_LOCAL_INLINE(PyObject *)
do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj)
{
char *s = PyString_AS_STRING(self);
Py_ssize_t len = PyString_GET_SIZE(self);
char *sep = PyString_AS_STRING(sepobj);
Py_ssize_t seplen = PyString_GET_SIZE(sepobj);
Py_ssize_t i, j;
i = 0;
if (striptype != RIGHTSTRIP) {
while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) {
i++;
}
}
j = len;
if (striptype != LEFTSTRIP) {
do {
j--;
} while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen));
j++;
}
if (i == 0 && j == len && PyString_CheckExact(self)) {
Py_INCREF(self);
return (PyObject*)self;
}
else
return PyString_FromStringAndSize(s+i, j-i);
}
Py\u LOCAL\u INLINE(PyObject*)
Doxstrip(PyStringObject*self,int-striptype,PyObject*sepobj)
{
char*s=PyString作为字符串(self);
Py_ssize_t len=PyString_GET_SIZE(self);
char*sep=PyString作为字符串(sepobj);
Py_ssize_t seplen=PyString_GET_SIZE(sepobj);
Py_ssize_t i,j;
i=0;
如果(striptype!=RIGHTSTRIP){
而(i=i&&memchr(sep,Py_-CHARMASK(s[j]),seplen));
j++;
}
如果(i==0&&j==len&&PyString\u CheckExact(self)){
Py_增量(自我);
返回(PyObject*)self;
}
其他的
从stringandsize(s+i,j-i)返回PyString_;
}
它与前一个相同,但它有额外的
memchr(sep,Py_CHARMASK(s[j]),seplen)
每次检查。因此,时间复杂度变成O(N*M),其中M
是要剥离的实际字符串的长度。在str
上没有str.delete
,它们是不可变的。你的意思是创建新字符串的str.remove
?你说的str.remove
是什么意思?它不存在…^oops对不起,是的,我指的是删除()操作。更新在str
上没有str.delete
,它们是不可变的。你的意思是创建新字符串的str.remove
?你说的str.remove
是什么意思?它不存在…^oops对不起,是的,我指的是删除()操作。updated@jamylak那很酷。在步骤为1的情况下,字符串切片也可以是O(1),是吗?@Ryan True它只是增加引用并返回完全相同的字符串@jamylak:PyString\u FromStringAndSize()
返回一个副本。否则,谁拥有哪些部件的问题可能会使垃圾收集变得复杂。它只为s[0:len(s):1]
大小写返回相同的字符串。s.strip(sep)
是O(len(s)*len(sep))
即O(n*m)
,而不是O(n*n)
,其中m
(实际上)是由字母大小限制的(256
).@J.F.Sebastian你说得对:-)更新了我的答案。@jamylak太酷了。在步骤为1的情况下,字符串切片也可以是O(1),是吗?@Ryan True它只是增加引用并返回完全相同的字符串@jamylak:PyString\u FromStringAndSize()
返回一个副本。否则,谁拥有哪些部件的问题可能会使垃圾收集变得复杂。它只为s[0:len(s):1]
案例返回相同的字符串。s.strip(sep)
是O(len(s)*len(sep))
即O(n*m)
,而不是O(n*n)
,其中m
(实际上)是由字母大小(256
)限定的。@J.F.Sebastian您是对的:-)更新了我的答案。
Py_LOCAL_INLINE(PyObject *)
do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj)
{
char *s = PyString_AS_STRING(self);
Py_ssize_t len = PyString_GET_SIZE(self);
char *sep = PyString_AS_STRING(sepobj);
Py_ssize_t seplen = PyString_GET_SIZE(sepobj);
Py_ssize_t i, j;
i = 0;
if (striptype != RIGHTSTRIP) {
while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) {
i++;
}
}
j = len;
if (striptype != LEFTSTRIP) {
do {
j--;
} while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen));
j++;
}
if (i == 0 && j == len && PyString_CheckExact(self)) {
Py_INCREF(self);
return (PyObject*)self;
}
else
return PyString_FromStringAndSize(s+i, j-i);
}