smartset: optimize 'generatorset & set' by applying a cutoff

Summary: See the previous commit for context.

Reviewed By: muirdm

Differential Revision: D45959185

fbshipit-source-id: ff60352111d175fa9dfd9609e0a1bb2a15dd776e
This commit is contained in:
Jun Wu 2023-06-06 11:13:25 -07:00 committed by Facebook GitHub Bot
parent f94acf4425
commit b1893b6b35

View File

@ -13,6 +13,7 @@
from __future__ import absolute_import
import copy
import itertools
import weakref
import bindings
@ -1481,10 +1482,10 @@ class generatorset(abstractsmartset):
>>> list(zs.slice(0, 2))
[40, 41]
Bad, the generatorset is not smart enough:
Cutoff early so count is less than 50:
>>> count
50
12
"""
def __init__(self, gen, iterasc=None, repo=None):
@ -1661,6 +1662,18 @@ class generatorset(abstractsmartset):
return self.last()
return next(it(), None)
def __and__(self, other):
if self.fastdesc:
other_min = other.fastmin()
if other_min is not None:
new_gen = itertools.takewhile(
lambda v: v >= other_min, self._rgen.iter()
)
this = generatorset(new_gen, iterasc=False, repo=self.repo())
this._ascending = self._ascending
return super(generatorset, this).__and__(other)
return super().__and__(other)
def __repr__(self):
d = {False: "-", True: "+"}[self._ascending]
return "<%s%s>" % (type(self).__name__, d)