diff -r c0e63937efa7 Lib/subprocess.py --- a/Lib/subprocess.py Wed Nov 20 00:14:49 2013 +0100 +++ b/Lib/subprocess.py Wed Nov 20 01:02:49 2013 +0100 @@ -1555,6 +1555,10 @@ class Popen(object): self._save_input(input) + # use a memoryview to avoid memory copies + if input: + input_view = memoryview(self._input) + with _PopenSelector() as selector: if self.stdin and input: selector.register(self.stdin, selectors.EVENT_WRITE) @@ -1576,8 +1580,8 @@ class Popen(object): for key, events in ready: if key.fileobj is self.stdin: - chunk = self._input[self._input_offset : - self._input_offset + _PIPE_BUF] + chunk = input_view[self._input_offset : + self._input_offset + _PIPE_BUF] try: self._input_offset += os.write(key.fd, chunk) except OSError as e: diff -r c0e63937efa7 Objects/listobject.c --- a/Objects/listobject.c Wed Nov 20 00:14:49 2013 +0100 +++ b/Objects/listobject.c Wed Nov 20 01:02:49 2013 +0100 @@ -2483,6 +2483,7 @@ list_ass_subscript(PyListObject* self, P PyObject **garbage; size_t cur; Py_ssize_t i; + int res; if (slicelength <= 0) return 0; @@ -2533,14 +2534,14 @@ list_ass_subscript(PyListObject* self, P } Py_SIZE(self) -= slicelength; - list_resize(self, Py_SIZE(self)); + res = list_resize(self, Py_SIZE(self)); for (i = 0; i < slicelength; i++) { Py_DECREF(garbage[i]); } PyMem_FREE(garbage); - return 0; + return res; } else { /* assign slice */