Giampaolo Rodola' added the comment: I mean something like this (for epoll), as in avoiding to call unregister() / register() at all:
diff -r 017e7391ab58 Lib/selectors.py --- a/Lib/selectors.py Wed Feb 04 08:37:02 2015 -0800 +++ b/Lib/selectors.py Thu Feb 05 18:42:26 2015 +0100 @@ -412,6 +412,23 @@ pass return key + def modify(self, fileobj, events, data=None): + try: + key = self._fd_to_key[self._fileobj_lookup(fileobj)] + except KeyError: + raise KeyError("{!r} is not registered".format(fileobj)) from None + if data != key.data: + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + if events != key.events: + epoll_events = 0 + if events & EVENT_READ: + epoll_events |= select.POLLIN + if events & EVENT_WRITE: + epoll_events |= select.POLLOUT + self._epoll.modify(key.fd, epoll_events) + return key + def select(self, timeout=None): if timeout is None: timeout = -1 Before the patch: ~/svn/python/3.5$ ./python -m timeit -s 'import os, selectors; s=selectors.EpollSelector(); r,w=os.pipe(); s.register(r, selectors.EVENT_READ)' 's.modify(r, selectors.EVENT_WRITE); s.modify(r, selectors.EVENT_READ)' 100000 loops, best of 3: 14.7 usec per loop After the patch: ~/svn/python/3.5$ ./python -m timeit -s 'import os, selectors; s=selectors.EpollSelector(); r,w=os.pipe(); s.register(r, selectors.EVENT_READ)' 's.modify(r, selectors.EVENT_WRITE); s.modify(r, selectors.EVENT_READ)' 100000 loops, best of 3: 3.07 usec per loop That's equal to about a 4.5x (+450%) speedup if I'm not mistaken. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue18932> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com