import collections import itertools import sys import timeit def filtered_combi(n, r): def good(combo): return not any(combo[i]+1 == combo[i+1] for i in range(len(combo)-1)) yield from filter(good, itertools.combinations(range(1, n+1), r)) def non_consecutive_combinator(rnge, r, prev=[]): if r == 0: yield prev else: for i, item in enumerate(rnge): for next_comb in non_consecutive_combinator(rnge[i+2:], r-1, prev+[item]): yield next_comb def recursive_combi(n, r): yield from non_consecutive_combinator(range(1, n+1), r) n0, n1, r0, r1 = map(int, sys.argv[1:]) for n in range(n0, n1): for r in range(r0, r1): for f in filtered_combi, recursive_combi: print(n, r, f.__name__[:4], end=' ') x = len(list(f(n, r))) print(x, end=' ') if x: t = timeit.timeit(lambda: collections.deque(f(n, r), maxlen=0), number=10000//n) / x print(t, end=' ') print()