import time
import string

def sub_combinations(segment, size=0):
    if segment == ():
        yield ()
        return
    stop = min(size or len(segment), len(segment))
    for i in range(1, stop + 1):
        for j in sub_combinations(segment[i:], size):
            yield (segment[:i],) + j


def subtuples(t):
  for i in range(1<< (len(t)-1)):
    result = [ [ t[0] ] ]
    for j in range(len(t)-1):
      if (1<<j) & i:
        result[-1].append(t[j+1])
      else:
        result.append([ t[j+1] ])
    yield result

f = sub_combinations
data = tuple(string.ascii_lowercase[:22])

for f in sub_combinations, subtuples:
    t0 = time.time()
    for x in f(data):
        pass
    print('{} {}'.format(f.__name__, time.time() - t0))