import argparse import random import subprocess import sys parser = argparse.ArgumentParser() parser.add_argument('control_exe') parser.add_argument('trial_exe') parser.add_argument('--set-length', default=1000) namespace = parser.parse_args() setup = 'a = set(range({namespace.set_length})); b = {{}}'.format(**vars()) in_value = random.randrange(namespace.set_length) out_value = namespace.set_length control_exe = namespace.control_exe trial_exe = namespace.trial_exe def do_case(control, value, statement): name, exe = ('control', control_exe) if control else ('trial', trial_exe) sys.stdout.write('{name:8}'.format(**vars())) sys.stdout.flush() subprocess.check_call([exe, '-m', 'timeit', '-r', '20', '-s', setup.format(value), statement]) for statement, cases in [ ('b in a', [ ('contains (value in set)', in_value), ('contains (value not in set)', out_value)]), ('a.add(b)', [ ('add (value in set, returns False)', in_value), ('add (value not in set, returns True)', out_value)]),]: for label, value in cases: print(label) for control in [True, False]: do_case(control, value, statement)