Raymond Hettinger <raymond.hettin...@gmail.com> added the comment:
Some thoughts: * Other than set operations, most of the pure python code in the dict view ABCs are fast pass throughs. There is no point in rewriting these in C: def __contains__(self, key): return key in self._mapping def __iter__(self): yield from self._mapping def __len__(self): return len(self._mapping) * For the set operations, the pure python code has only a simple for-loop and contains test. There isn't much fat to be cut: def __ge__(self, other): if not isinstance(other, Set): return NotImplemented if len(self) < len(other): return False for elem in other: if elem not in self: return False return True * Possibly the eval-loop overhead can be eliminated with Python by using itertools: def __ge__(self, other): if not isinstance(other, Set): return NotImplemented if len(self) < len(other): return False for elem in filterfalse(self.__contains__, other): return False return True * That leaves the question of why the dict views are so much faster (presuming that the posted timings are representative). I haven't looked in detail, but the first candidate that comes to mind is that dictviews_to_set() has a fast path for exact dicts. That lets it bypass the mapping proxy and exploit the fast path in PySet_New for exact dicts. That fast path reuses the stored hash values and exploits knowing that the input has no duplicates. Off-hand, I don't see how that can generalize to the arbitrary mappings supports by the view ABCs. * Summary: A first look, it doesn't seem like a C rewrite of the view ABCs would bear fruit. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue46713> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com