'''Time comparison of algorithms regarding this question:
http://stackoverflow.com/questions/8344905/pythons-fastest-way-of-randomising-case-of-a-string/8344979#8344979'''

import timeit
import __main__
import random


N = 100 #Number of executions

s = 'a'*1000

def test_f_initial():
    word_cap = ''
    for x in s:
        if random.randint(0,1):
            word_cap += x.upper()
        else:
            word_cap += x.lower()
    return word_cap


def test_f_initial_local():
    ri = random.randint
    word_cap = ''
    for x in s:
        if ri(0,1):
            word_cap += x.upper()
        else:
            word_cap += x.lower()
    return word_cap


def test_f_a():
    return ''.join(random.choice((str.upper,str.lower))(x) for x in s)


def test_f_a_local():
    rc = random.choice
    return ''.join(rc((str.upper,str.lower))(x) for x in s)


def test_f_aa():
    f_set = (str.upper, str.lower) #moving functions to the local namespace
    return ''.join(random.choice(f_set)(x) for x in s)


def test_f_aa_local():
    rc = random.choice
    f_set = (str.upper, str.lower) #moving functions to the local namespace
    return ''.join(rc(f_set)(x) for x in s)


def test_f_b():
    caps = s.upper()
    lowers = s.lower()
    return ''.join(x[random.randint(0,1)] for x in zip(lowers, caps))


def test_f_b_local():
    caps = s.upper()
    lowers = s.lower()
    ri = random.randint
    return ''.join(x[ri(0,1)] for x in zip(lowers, caps))


def test_f_ba():
    caps = s.upper()
    lowers = s.lower()
    return ''.join(random.choice(x) for x in zip(lowers, caps))


def test_f_ba_local():
    rc = random.choice
    caps = s.upper()
    lowers = s.lower()
    return ''.join(rc(x) for x in zip(lowers, caps))

    
names = dir(__main__)
for name in names:
    attr = getattr(__main__,name)
    if hasattr(attr,'__call__'):
        if name.startswith('test_f_'):
            init_name = name + '_init'
            if hasattr(__main__, init_name):
                init = getattr(__main__,init_name)
            else:
                init = 'from __main__ import {name}'.format(name=name)
            t = timeit.Timer(stmt='{name}()'.format(name=name),
                             setup=init)

            time = t.timeit(N)
            print('{name}: {time}'.format(name=name,time=time))