Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
 def arbitrary_entry(i):
     return (fastdivmod.powersum(self.content_length, lowest,
                                 i + lowest - 1), i + lowest)
Example #5
0
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
Example #6
0
 def arbitrary_entry(i):
     return (fastdivmod.powersum(self.content_length, lowest, i+lowest-1), i+lowest)
Example #7
0
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
Example #8
0
 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)