[Python-ideas] Add function readbyte to asyncio.StreamReader

Jörn Heissler python-ideas-2018 at tutnicht.de
Sun Jul 22 07:03:40 EDT 2018


Hello,

I'm implementing a protocol where I need to read individual bytes until
a condition is met (value & 0x80 == 0).

My current approach is: value = (await reader.readexactly(1))[0]

To speed this up, I propose that a new function is added to
asyncio.StreamReader: value = await reader.readbyte()

I duplicated readexactly and stripped out some parts. Below code appears
to work:

    async def readbyte(self):
        if self._exception is not None:
            raise self._exception

        while not self._buffer:
            if self._eof:
                raise EOFError()
            await self._wait_for_data('readbyte')

        data = self._buffer[0]
        del self._buffer[0]
        self._maybe_resume_transport()
        return data

For comparing the speed, I'm receiving a 50 MiB file byte-by-byte.

cpython-3.7.0:
    readexactly: 42.43 seconds
    readbyte   : 22.05 seconds
    speedup    : 92.4%

pypy3-v6.0.0:
    readexactly: 3.21 seconds
    readbyte   : 2.76 seconds
    speedup    : 16.3%

Thanks


More information about the Python-ideas mailing list