#!/usr/bin/env python3.3 from time import perf_counter from ssl import RAND_pseudo_bytes, RAND_bytes from os import urandom as os_urandom BYTES = (1, 4, 8, 16, 32, 64, 128) LOOPS = 500000 dev_urandom = open("/dev/urandom", "rb").read dev_urandom_nonbuf = open("/dev/urandom", "rb", buffering=0).read PRNGS = [("urandom (fd)\t\t", dev_urandom), ("urandom (fd, no buf)\t", dev_urandom_nonbuf), ("os.urandom()\t\t", os_urandom), ("RAND_pseudo_bytes\t", RAND_pseudo_bytes), ("RAND_bytes\t\t", RAND_bytes)] def benchmark(name, func, loops, *sizes): print(name, end="") for size in sizes: start = perf_counter() for i in range(loops): func(size) end = perf_counter() print("%0.03f\t" % (end - start), end="") print("") fmt = "Loops: {}\t" + "\t{}" * len(BYTES) print(fmt.format(LOOPS, *BYTES)) for name, func in PRNGS: benchmark(name, func, LOOPS, *BYTES)