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

时间:2014-12-29 06:49:38

标签: python python-2.7 python-internals

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

由于对于单个字符的删除是O(n),对于字符串是条带O(n ^ 2)吗?

1 个答案:

答案 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直到它找到一个非空格字符。最后,使用此

返回ij之间的字符串
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是要剥离的实际字符串的长度。