import sys from boltons.listutils import SplayList, BarrelList def test_splay_list(): splay = SplayList(range(10)) splay.swap(0, 9) assert splay[0] == 9 assert splay[-1] == 0 splay.shift(-2) assert splay[0] == 8 assert splay[-1] == 0 assert len(splay) == 10 def test_barrel_list(): bl = BarrelList() bl.insert(0, 0) assert bl[0] == 0 assert len(bl) == 1 bl.insert(1, 1) assert list(bl) == [0, 1] bl.insert(0, -1) assert list(bl) == [-1, 0, 1] bl.extend(range(int(1e5))) assert len(bl) == (1e5 + 3) bl._balance_list(0) assert len(bl) == (1e5 + 3) bl.pop(50000) assert len(bl) == (1e5 + 3 - 1) bl2 = BarrelList(TEST_INTS) bl2.sort() assert list(bl2[:5]) == [0, 74, 80, 96, 150] assert list(bl2[:-5:-1]) == [50508, 46607, 46428, 43442] # a hundred thousand integers bl3 = BarrelList(range(int(1e5))) for i in range(10000): # move the middle ten thou to the beginning bl3.insert(0, bl3.pop(len(bl3) // 2)) assert len(bl3) == 1e5 # length didn't change assert bl3[0] == 40001 # first value changed as expected assert bl3[-1] == sorted(bl3)[-1] # last value didn't change del bl3[10:5000] assert bl3[0] == 40001 assert len(bl3) == 1e5 - (5000 - 10) # length stayed co bl3[:20:2] = range(0, -10, -1) assert bl3[6] == -3 # some truly tricky stepping/slicing works # roughly increasing random integers # [ord(i) * x for i, x in zip(os.urandom(1024), range(1024))] TEST_INTS = [0, 74, 96, 183, 456, 150, 1098, 665, 1752, 1053, 190, 561, 2244, 2964, 2534, 750, 80, 612, 3780, 2698, 1320, 4935, 5324, 3220, 672, 2925, 6474, 6507, 3892, 4814, 1470, 6913, 6112, 6072, 7854, 8540, 4212, 7770, 8702, 1404, 2240, 902, 5250, 10320, 9680, 8775, 2392, 11327, 10368, 8085, 7750, 9333, 8008, 11395, 6858, 8690, 14112, 5358, 13572, 3304, 9000, 11712, 1426, 12033, 11136, 10270, 10626, 11189, 7208, 966, 9380, 16614, 10368, 11680, 8214, 16350, 4712, 5082, 13572, 15879, 6800, 8667, 17548, 9628, 3360, 19550, 1634, 20619, 1232, 17978, 22950, 10829, 5612, 22692, 10058, 21375, 19680, 5626, 15582, 18216, 2200, 20402, 24174, 3090, 19864, 2520, 15794, 18511, 4212, 18530, 8470, 7992, 5152, 4294, 456, 6095, 26564, 9477, 14042, 7259, 14520, 28677, 9394, 5289, 7812, 1625, 17514, 7493, 24704, 903, 33150, 1834, 11352, 20615, 32562, 540, 6256, 12878, 276, 17236, 6300, 25380, 9088, 27742, 4752, 33930, 7008, 22491, 7992, 2831, 34200, 18271, 22648, 6426, 15862, 26660, 29484, 2826, 14378, 26553, 16000, 18998, 28998, 16626, 19024, 22275, 18426, 21042, 29064, 30927, 26010, 14193, 9976, 30621, 12354, 33600, 40832, 20178, 20292, 12709, 26640, 29865, 23660, 20862, 34592, 28305, 24180, 38709, 18800, 11907, 28120, 34189, 4992, 8106, 14938, 6435, 12936, 31914, 1782, 995, 9800, 28542, 22018, 27608, 30396, 28700, 26986, 50508, 5616, 46607, 2310, 41356, 26712, 8733, 43442, 33755, 21384, 40145, 26160, 46428, 30360] test_barrel_list() if __name__ == '__main__': _TUNE_SETUP = """\ from boltons.listutils import BarrelList bl = BarrelList() bl._size_factor = %s bl.extend(range(int(%s))) """ def tune(): from collections import defaultdict import gc from timeit import timeit data_size = 1e5 old_size_factor = size_factor = 512 all_times = defaultdict(list) min_times = {} step = 512 while abs(step) > 4: gc.collect() for x in range(3): tottime = timeit('bl.insert(0, bl.pop(len(bl)//2))', _TUNE_SETUP % (size_factor, data_size), number=10000) all_times[size_factor].append(tottime) min_time = round(min(all_times[size_factor]), 3) min_times[size_factor] = min_time print(size_factor, min_time, step) if min_time > (min_times[old_size_factor] + 0.002): step = -step // 2 old_size_factor = size_factor size_factor += step print(tottime) try: tune() # main() except Exception as e: import pdb;pdb.post_mortem() raise