def prefix_keys(tokens, block_size): block_ends = range(block_size, len(tokens) + 1, block_size) return [tuple(tokens[:end]) for end in block_ends] first = [10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33] second = [10, 11, 12, 13, 20, 21, 22, 23, 40, 41, 42, 43] cache = set() first_keys = prefix_keys(first, block_size=4) first_hits = sum(key in cache for key in first_keys) cache.update(first_keys) second_keys = prefix_keys(second, block_size=4) second_hits = sum(key in cache for key in second_keys) print("first request reused:", first_hits, "of", len(first_keys), "blocks") print("second request reused:", second_hits, "of", len(second_keys), "blocks") print("second request computes:", len(second_keys) - second_hits, "new block") # Output: """ first request reused: 0 of 3 blocks second request reused: 2 of 3 blocks second request computes: 1 new block """