def __init__(self, content, lowest=1, highest=1): self.content = content self.content_length = content.__len__() self.length = fastdivmod.powersum(self.content_length, lowest, highest) self.lowest = lowest self.highest = highest def arbitrary_entry(i): return (fastdivmod.powersum(self.content_length, lowest, i+lowest-1), i+lowest) def entry_from_prev(i, prev): return (prev[0] + (self.content_length ** prev[1]), prev[1] + 1) self.offsets = cachingseq.CachingFuncSequence( arbitrary_entry, highest - lowest+1, entry_from_prev) # This needs to be a constant in order to reuse caclulations in future # calls to bisect (a moving target will produce more misses). if self.offsets[-1][0] > sys.maxsize: i = 0 while i + 2 < len(self.offsets): if self.offsets[i+1][0] > sys.maxsize: self.index_of_offset = i self.offset_break = self.offsets[i][0] break i += 1 else: self.index_of_offset = len(self.offsets) self.offset_break = sys.maxsize
def __init__(self, content, lowest=1, highest=1): self.content = content self.content_length = content.__len__() self.length = fastdivmod.powersum(self.content_length, lowest, highest) self.lowest = lowest self.highest = highest def arbitrary_entry(i): return (fastdivmod.powersum(self.content_length, lowest, i + lowest - 1), i + lowest) def entry_from_prev(i, prev): return (prev[0] + (self.content_length**prev[1]), prev[1] + 1) self.offsets = cachingseq.CachingFuncSequence(arbitrary_entry, highest - lowest + 1, entry_from_prev) # This needs to be a constant in order to reuse caclulations in future # calls to bisect (a moving target will produce more misses). if self.offsets[-1][0] > sys.maxint: i = 0 while i + 2 < len(self.offsets): if self.offsets[i + 1][0] > sys.maxint: self.index_of_offset = i self.offset_break = self.offsets[i][0] break i += 1 else: self.index_of_offset = len(self.offsets) self.offset_break = sys.maxint
def __init__(self, content, lowest=1, highest=1): self.content = content self.content_length = content.__len__() self.length = fastdivmod.powersum(self.content_length, lowest, highest) self.lowest = lowest self.highest = highest def arbitrary_entry(i): return ( fastdivmod.powersum(self.content_length, lowest, i + lowest - 1), i + lowest, ) def entry_from_prev(i, prev): return (prev[0] + (self.content_length**prev[1]), prev[1] + 1) self.offsets = cachingseq.CachingFuncSequence(arbitrary_entry, highest - lowest + 1, entry_from_prev) # `offset_break` is an optimization around bisect, which would normally # choose the "middle" value to bisect on, which does a lot of work # that's unnecessary at the bottom of the range (say, the first 256 # entries). # # A good choice of OFFSET_BREAK_THRESHOLD minimizes the wasted work up # front (we have to calculate all the offsets now up to it), and is # still larger than most performant lookups will need. Anything above # that will result in a big penalty as we get into arbitrary-precision # integers and use the standard bisect logic. if self.offsets[-1][0] > OFFSET_BREAK_THRESHOLD: for i in range(len(self.offsets) - 1): if self.offsets[i + 1][0] > OFFSET_BREAK_THRESHOLD: self.index_of_offset = i self.offset_break = self.offsets[i][0] return self.index_of_offset = len(self.offsets) self.offset_break = self.offsets[-1][0] + 1
def arbitrary_entry(i): return (fastdivmod.powersum(self.content_length, lowest, i + lowest - 1), i + lowest)
def powersum_runner(base, low, high): expected = sum([base ** i for i in range(low, high+1)]) actual = powersum(base, low, high) assert expected == actual
def arbitrary_entry(i): return (fastdivmod.powersum(self.content_length, lowest, i+lowest-1), i+lowest)
def powersum_runner(base, low, high): expected = sum([base**i for i in range(low, high + 1)]) actual = powersum(base, low, high) assert expected == actual
def test_powersum(self, base, low, high): expected = sum([base**i for i in range(low, high + 1)]) actual = powersum(base, low, high) self.assertEqual(expected, actual)