Index: Objects/stringobject.c =================================================================== --- Objects/stringobject.c (.../p3yk) (revision 53047) +++ Objects/stringobject.c (.../p3yk-noslice) (revision 53047) @@ -1223,6 +1200,17 @@ if (slicelength <= 0) { return PyString_FromStringAndSize("", 0); } + else if (start == 0 && step == 1 && + slicelength == PyString_GET_SIZE(self) && + PyString_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } + else if (step == 1) { + return PyString_FromStringAndSize( + PyString_AS_STRING(self) + start, + slicelength); + } else { source_buf = PyString_AsString((PyObject*)self); result_buf = (char *)PyMem_Malloc(slicelength); Index: Objects/unicodeobject.c =================================================================== --- Objects/unicodeobject.c (.../p3yk) (revision 53047) +++ Objects/unicodeobject.c (.../p3yk-noslice) (revision 53047) @@ -7103,6 +7081,12 @@ if (slicelength <= 0) { return PyUnicode_FromUnicode(NULL, 0); + } else if (start == 0 && step == 1 && slicelength == self->length && + PyUnicode_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } else if (step == 1) { + return PyUnicode_FromUnicode(self->str + start, slicelength); } else { source_buf = PyUnicode_AS_UNICODE((PyObject*)self); result_buf = (Py_UNICODE *)PyMem_MALLOC(slicelength* Index: Objects/tupleobject.c =================================================================== --- Objects/tupleobject.c (.../p3yk) (revision 53047) +++ Objects/tupleobject.c (.../p3yk-noslice) (revision 53047) @@ -603,6 +603,12 @@ if (slicelength <= 0) { return PyTuple_New(0); } + else if (start == 0 && step == 1 && + slicelength == PyTuple_GET_SIZE(self) && + PyTuple_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } else { result = PyTuple_New(slicelength); if (!result) return NULL;