Python' strip()的运行时间是什么?
由于对于单个字符的删除是O(n),对于字符串是条带O(n ^ 2)吗?
答案 0 :(得分:6)
它也只是O(N)。引用与删除空格from the version 2.7.9
的普通strip
对应的代码
Py_LOCAL_INLINE(PyObject *)
do_strip(PyStringObject *self, int striptype)
{
char *s = PyString_AS_STRING(self);
Py_ssize_t len = PyString_GET_SIZE(self), i, j;
i = 0;
if (striptype != RIGHTSTRIP) {
while (i < len && isspace(Py_CHARMASK(s[i]))) {
i++;
}
}
j = len;
if (striptype != LEFTSTRIP) {
do {
j--;
} while (j >= i && isspace(Py_CHARMASK(s[j])));
j++;
}
if (i == 0 && j == len && PyString_CheckExact(self)) {
Py_INCREF(self);
return (PyObject*)self;
}
else
return PyString_FromStringAndSize(s+i, j-i);
}
它首先从左边开始并递增变量i
,直到它找到一个非空格字符然后从右边开始并递减j
直到它找到一个非空格字符。最后,使用此
i
和j
之间的字符串
PyString_FromStringAndSize(s+i, j-i)
但另一方面,the strip
which removes the set of characters稍微复杂但非常相似。
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);
}
它与前一个相同,但每次都会进行额外的memchr(sep, Py_CHARMASK(s[j]), seplen)
检查。因此,它的时间复杂度变为O(N * M),其中M
是要剥离的实际字符串的长度。