Message 235439 - Python tracker

Message235439

Author giampaolo.rodola
Recipients christian.heimes, felipecruz, giampaolo.rodola, gvanrossum, meador.inge, neologix, pitrou, python-dev, rosslagerwall, sbt, vstinner, yselivanov
Date 2015-02-05.17:46:37
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1423158397.81.0.440752855385.issue18932@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2015-02-05 17:46:37giampaolo.rodolasetrecipients: + giampaolo.rodola, gvanrossum, pitrou, vstinner, christian.heimes, meador.inge, neologix, rosslagerwall, python-dev, sbt, felipecruz, yselivanov
2015-02-05 17:46:37giampaolo.rodolasetmessageid: <1423158397.81.0.440752855385.issue18932@psf.upfronthosting.co.za>
2015-02-05 17:46:37giampaolo.rodolalinkissue18932 messages
2015-02-05 17:46:37giampaolo.rodolacreate