from random import randrange from operator import add import sys HAVE_MINKW = sys.version_info[:2] >= (2, 5) def time_chr(n): 'chr(i)' result = '' for i in range(n): for j in range(256): c = chr(j) if c < result: result = c assert c == '\xff' def time_hash(n): 'hash(i)' result = '' for i in range(n): for j in range(256): c = hash(j) if c < result: result = c assert c == 255 def time_ord(n): 'ord(i)' result = '' for i in range(n): for j in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ": c = ord(j) if c < result: result = c assert c == 90, c def time_round(n): 'round(f)' s = 0.0 for i in range(n): for mult in (-.125, .125): for j in range(256): s += round(i*j*mult) assert s == 0.0 and isinstance(s, float) def time_pow(n): prod = 1.0 for i in range(n): for b in (-3,-2.1, 1, 2.5, 3, 4.1 ,5 ,6): for e in range(-6, 7): prod *= pow(b, e) assert round(prod, 3) == 1.0 test_lists = [[randrange(-1000, 1000) for i in range(1000)] for j in range(100)] mins = [sorted(test_list)[0] for test_list in test_lists] maxes = [sorted(test_list)[-1] for test_list in test_lists] sums = [reduce(add, test_list) for test_list in test_lists] def time_min(n, test_lists=test_lists, mins=mins): s = 0 test_indicies = range(len(test_lists)) for i in range(n): for j in test_indicies: test_list = test_lists[j] m = min(test_list) s += (m == mins[j]) assert s == n * len(test_lists) def time_min_kw(n, test_lists=test_lists, mins=mins): s = 0 test_indicies = range(len(test_lists)) keyfunc = lambda x: -x for i in range(n): for j in test_indicies: test_list = test_lists[j] m = min(test_list, key=keyfunc) s += (m == maxes[j]) assert s == n * len(test_lists) if not HAVE_MINKW: del time_min_kw def time_sums(n, test_lists=test_lists, sums=sums): s = 0 test_indicies = range(len(test_lists)) for i in range(n): for j in test_indicies: test_list = test_lists[j] m = sum(test_list) s += (m == sums[j]) assert s == n * len(test_lists) def time_reduce(n, test_lists=test_lists, sums=sums, add=add): s = 0 test_indicies = range(len(test_lists)) add = lambda x, y: x+y for i in range(n): for j in test_indicies: test_list = test_lists[j] m1 = reduce(add, test_list) m2 = reduce(add, test_list, 0) s += (m1 == m2 == sums[j]) assert s == n * len(test_lists) def time_int_round(n): 'int(round(f))' s = 0 for i in range(n): for mult in (-.125, .125): for j in range(256): s += int(round(i*j*mult)) assert s == 0 and isinstance(s, int)