[New-bugs-announce] [issue32348] Optimize asyncio.Future schedule/add/remove callback

Yury Selivanov report at bugs.python.org
Sat Dec 16 18:50:13 EST 2017


New submission from Yury Selivanov <yselivanov at gmail.com>:

Key observation: 99.9% of the time Futures and Tasks have only one callback.  

Currently we have a list of callbacks in each Future/Task.  We can avoid list object allocation if we add a field to store the first callback.  This way we'll only need to ever allocate the list if a Future/Task has more than one done callbacks.

asyncio with the proposed patch applied shows that 3-6% better performance of an asyncio echo server implemented using asyncio.streams.  This benchmark involves quite a bit of other Python code, so this improvement is actually quite significant.

The patch consists of:

1. first callback / callbacks list refactoring.

2. a free list implementation for Future.__await__ objects (which are created on almost all awaits in asyncio).

3. a big cleanup of the code, ensuring that Future/Task are always initialized properly.

----------
assignee: yselivanov
components: asyncio
messages: 308481
nosy: asvetlov, yselivanov
priority: normal
severity: normal
status: open
title: Optimize asyncio.Future schedule/add/remove callback
versions: Python 3.7

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue32348>
_______________________________________


More information about the New-bugs-announce mailing list