import random import distrib from timeit import timeit from itertools import islice def runiform(): for i in range(10000): random.uniform(-10, 10) def duniform(): for r in distrib.uniform(-10, 10): pass def random_test(n, func, args): def t(): for i in range(n): func(*args) return t def distrib_test(n, func, args): def t(): for r in islice(func(*args), n): pass return t tests = [ ('random', ()), ('randrange', (0, 100, 5)), ('randint', (1, 100)), ('uniform', (-10.0, 10.0)), ('triangular', (0.0, 10.0, 6.0)), ('gauss', (5.0, 2.0)), ('normalvariate', (5.0, 2.0)), ('lognormvariate', (5.0, 2.0)), ('expovariate', (0.1,)), ('vonmisesvariate', (1.0, 1.0)), ('gammavariate', (0.35, 1.45)), ('betavariate', (2.71828, 3.14159)), ('paretovariate', (5.0,)), ('weibullvariate', (1.0, 3.0)), ('choice', (list(range(1000)),)), #('choice', (list(range(1000)), list(range(1, 1000 + 1)))), ] n = 10000 print('%-30s %7s %7s' % ('', 'random', 'distrib')) for name, args in tests: s = '%s%r' % (name, args) if len(s) > 30: s = s[:27] + '...' t1 = timeit(random_test(n, getattr(random, name), args), number=10) t2 = timeit(distrib_test(n, getattr(distrib, name), args), number=10) print('%-30.40s %7.3f %7.3f %5.2f' % (s, t1, t2, t1 / t2))