import sys import multiprocessing from happyc import digit_square_sum # 21:04 $ time python multiprocessing_happy.py 2147483647 # 40001837 # # real 2m26.131s # user 18m46.440s # sys 0m1.204s MAX_INPUT=1999999999999999999 def happy(max_number): precomputed = precompute(digit_square_sum(MAX_INPUT)) process_count = multiprocessing.cpu_count() batch_size = max_number // process_count counter = multiprocessing.Value('i', 0) processes = [] for i in range(0, process_count): r = range(i * batch_size, (i + 1) * batch_size) if i == process_count - 1: r = range(i * batch_size, max_number + 1) p = multiprocessing.Process(target=count_range, args=(counter, r, precomputed)) processes.append(p) for p in processes: p.start() p.join() return counter.value def precompute(max_number): return list(map(lambda x: is_happy(x), range(0, max_number+1))) def count_range(counter, r, precomputed): total = sum(1 for _ in filter(lambda x: precomputed[digit_square_sum(x)], r)) counter.value += total def is_happy(x): seen = set() current = x while current not in seen: seen.add(current) current = digit_square_sum(current) return current == 1 if __name__ == '__main__': print(happy(int(sys.argv[1])))