]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-106751: selectors: optimize EpollSelector.select() (#106754)
authorJ. Nick Koston <nick@koston.org>
Tue, 18 Jul 2023 10:16:32 +0000 (00:16 -1000)
committerGitHub <noreply@github.com>
Tue, 18 Jul 2023 10:16:32 +0000 (10:16 +0000)
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Lib/selectors.py
Misc/NEWS.d/next/Library/2023-07-14-20-31-09.gh-issue-106751.52F6yQ.rst [new file with mode: 0644]

index 6d82935445d4b1998d2f433db7acb82d47bb9dfd..a42d15634064178acbe4cbdcc29e07c8b0ba2de1 100644 (file)
@@ -430,6 +430,9 @@ if hasattr(select, 'poll'):
 
 if hasattr(select, 'epoll'):
 
+    _NOT_EPOLLIN = ~select.EPOLLIN
+    _NOT_EPOLLOUT = ~select.EPOLLOUT
+
     class EpollSelector(_PollLikeSelector):
         """Epoll-based selector."""
         _selector_cls = select.epoll
@@ -452,22 +455,20 @@ if hasattr(select, 'epoll'):
             # epoll_wait() expects `maxevents` to be greater than zero;
             # we want to make sure that `select()` can be called when no
             # FD is registered.
-            max_ev = max(len(self._fd_to_key), 1)
+            max_ev = len(self._fd_to_key) or 1
 
             ready = []
             try:
                 fd_event_list = self._selector.poll(timeout, max_ev)
             except InterruptedError:
                 return ready
-            for fd, event in fd_event_list:
-                events = 0
-                if event & ~select.EPOLLIN:
-                    events |= EVENT_WRITE
-                if event & ~select.EPOLLOUT:
-                    events |= EVENT_READ
 
-                key = self._fd_to_key.get(fd)
+            fd_to_key = self._fd_to_key
+            for fd, event in fd_event_list:
+                key = fd_to_key.get(fd)
                 if key:
+                    events = ((event & _NOT_EPOLLIN and EVENT_WRITE)
+                              | (event & _NOT_EPOLLOUT and EVENT_READ))
                     ready.append((key, events & key.events))
             return ready
 
diff --git a/Misc/NEWS.d/next/Library/2023-07-14-20-31-09.gh-issue-106751.52F6yQ.rst b/Misc/NEWS.d/next/Library/2023-07-14-20-31-09.gh-issue-106751.52F6yQ.rst
new file mode 100644 (file)
index 0000000..486b1f9
--- /dev/null
@@ -0,0 +1 @@
+:mod:`selectors`: Optimize ``EpollSelector.select()`` code by moving some code outside of the loop.