'''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))
JycnVGltZSBjb21wYXJpc29uIG9mIGFsZ29yaXRobXMgcmVnYXJkaW5nIHRoaXMgcXVlc3Rpb246Cmh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODM0NDkwNS9weXRob25zLWZhc3Rlc3Qtd2F5LW9mLXJhbmRvbWlzaW5nLWNhc2Utb2YtYS1zdHJpbmcvODM0NDk3OSM4MzQ0OTc5JycnCgppbXBvcnQgdGltZWl0CmltcG9ydCBfX21haW5fXwppbXBvcnQgcmFuZG9tCgoKTiA9IDEwMCAjTnVtYmVyIG9mIGV4ZWN1dGlvbnMKCnMgPSAnYScqMTAwMAoKZGVmIHRlc3RfZl9pbml0aWFsKCk6CiAgICB3b3JkX2NhcCA9ICcnCiAgICBmb3IgeCBpbiBzOgogICAgICAgIGlmIHJhbmRvbS5yYW5kaW50KDAsMSk6CiAgICAgICAgICAgIHdvcmRfY2FwICs9IHgudXBwZXIoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdvcmRfY2FwICs9IHgubG93ZXIoKQogICAgcmV0dXJuIHdvcmRfY2FwCgoKZGVmIHRlc3RfZl9pbml0aWFsX2xvY2FsKCk6CiAgICByaSA9IHJhbmRvbS5yYW5kaW50CiAgICB3b3JkX2NhcCA9ICcnCiAgICBmb3IgeCBpbiBzOgogICAgICAgIGlmIHJpKDAsMSk6CiAgICAgICAgICAgIHdvcmRfY2FwICs9IHgudXBwZXIoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdvcmRfY2FwICs9IHgubG93ZXIoKQogICAgcmV0dXJuIHdvcmRfY2FwCgoKZGVmIHRlc3RfZl9hKCk6CiAgICByZXR1cm4gJycuam9pbihyYW5kb20uY2hvaWNlKChzdHIudXBwZXIsc3RyLmxvd2VyKSkoeCkgZm9yIHggaW4gcykKCgpkZWYgdGVzdF9mX2FfbG9jYWwoKToKICAgIHJjID0gcmFuZG9tLmNob2ljZQogICAgcmV0dXJuICcnLmpvaW4ocmMoKHN0ci51cHBlcixzdHIubG93ZXIpKSh4KSBmb3IgeCBpbiBzKQoKCmRlZiB0ZXN0X2ZfYWEoKToKICAgIGZfc2V0ID0gKHN0ci51cHBlciwgc3RyLmxvd2VyKSAjbW92aW5nIGZ1bmN0aW9ucyB0byB0aGUgbG9jYWwgbmFtZXNwYWNlCiAgICByZXR1cm4gJycuam9pbihyYW5kb20uY2hvaWNlKGZfc2V0KSh4KSBmb3IgeCBpbiBzKQoKCmRlZiB0ZXN0X2ZfYWFfbG9jYWwoKToKICAgIHJjID0gcmFuZG9tLmNob2ljZQogICAgZl9zZXQgPSAoc3RyLnVwcGVyLCBzdHIubG93ZXIpICNtb3ZpbmcgZnVuY3Rpb25zIHRvIHRoZSBsb2NhbCBuYW1lc3BhY2UKICAgIHJldHVybiAnJy5qb2luKHJjKGZfc2V0KSh4KSBmb3IgeCBpbiBzKQoKCmRlZiB0ZXN0X2ZfYigpOgogICAgY2FwcyA9IHMudXBwZXIoKQogICAgbG93ZXJzID0gcy5sb3dlcigpCiAgICByZXR1cm4gJycuam9pbih4W3JhbmRvbS5yYW5kaW50KDAsMSldIGZvciB4IGluIHppcChsb3dlcnMsIGNhcHMpKQoKCmRlZiB0ZXN0X2ZfYl9sb2NhbCgpOgogICAgY2FwcyA9IHMudXBwZXIoKQogICAgbG93ZXJzID0gcy5sb3dlcigpCiAgICByaSA9IHJhbmRvbS5yYW5kaW50CiAgICByZXR1cm4gJycuam9pbih4W3JpKDAsMSldIGZvciB4IGluIHppcChsb3dlcnMsIGNhcHMpKQoKCmRlZiB0ZXN0X2ZfYmEoKToKICAgIGNhcHMgPSBzLnVwcGVyKCkKICAgIGxvd2VycyA9IHMubG93ZXIoKQogICAgcmV0dXJuICcnLmpvaW4ocmFuZG9tLmNob2ljZSh4KSBmb3IgeCBpbiB6aXAobG93ZXJzLCBjYXBzKSkKCgpkZWYgdGVzdF9mX2JhX2xvY2FsKCk6CiAgICByYyA9IHJhbmRvbS5jaG9pY2UKICAgIGNhcHMgPSBzLnVwcGVyKCkKICAgIGxvd2VycyA9IHMubG93ZXIoKQogICAgcmV0dXJuICcnLmpvaW4ocmMoeCkgZm9yIHggaW4gemlwKGxvd2VycywgY2FwcykpCgogICAgCm5hbWVzID0gZGlyKF9fbWFpbl9fKQpmb3IgbmFtZSBpbiBuYW1lczoKICAgIGF0dHIgPSBnZXRhdHRyKF9fbWFpbl9fLG5hbWUpCiAgICBpZiBoYXNhdHRyKGF0dHIsJ19fY2FsbF9fJyk6CiAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCd0ZXN0X2ZfJyk6CiAgICAgICAgICAgIGluaXRfbmFtZSA9IG5hbWUgKyAnX2luaXQnCiAgICAgICAgICAgIGlmIGhhc2F0dHIoX19tYWluX18sIGluaXRfbmFtZSk6CiAgICAgICAgICAgICAgICBpbml0ID0gZ2V0YXR0cihfX21haW5fXyxpbml0X25hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbml0ID0gJ2Zyb20gX19tYWluX18gaW1wb3J0IHtuYW1lfScuZm9ybWF0KG5hbWU9bmFtZSkKICAgICAgICAgICAgdCA9IHRpbWVpdC5UaW1lcihzdG10PSd7bmFtZX0oKScuZm9ybWF0KG5hbWU9bmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXA9aW5pdCkKCiAgICAgICAgICAgIHRpbWUgPSB0LnRpbWVpdChOKQogICAgICAgICAgICBwcmludCgne25hbWV9OiB7dGltZX0nLmZvcm1hdChuYW1lPW5hbWUsdGltZT10aW1lKSk=