什么';是Python的运行时';s strip()?

什么';是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

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_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);
}