`os.read()` allocated and filled a buffer by calling `read(2)`, than that
data was copied into the user provied buffer. Read directly into the
caller's buffer instead by using `os.readinto()`.
`os.readinto()` uses `PyObject_GetBuffer()` to make sure the passed
in buffer is writeable and bytes-like, drop the manual check.
return bytes(result)
- def readinto(self, b):
+ def readinto(self, buffer):
"""Same as RawIOBase.readinto()."""
- m = memoryview(b).cast('B')
- data = self.read(len(m))
- n = len(data)
- m[:n] = data
- return n
+ self._checkClosed()
+ self._checkReadable()
+ try:
+ return os.readinto(self._fd, buffer)
+ except BlockingIOError:
+ return None
def write(self, b):
"""Write bytes b to file, return number written.
--- /dev/null
+Optimize ``_pyio.FileIO.readinto`` by avoiding unnecessary objects and copies using :func:`os.readinto`.