3 """Measure how a sorting executable scales with N.
5 The executable should support the following usage:
6 executable path/to/data/file
7 Where the data file is of the format output by data.py.
16 matplotlib.use('Agg') # select backend that doesn't require X Windows
20 def generate_data(stream, N, ordered=False):
21 print >> sys.stderr, 'generate %d data points (ordered? %s)' % (
25 args = ['./data.py', str(N)]
27 args.insert(1, '--ordered')
28 q = subprocess.Popen(args, stdout=stream)
30 assert status == 0, status
33 def run_test(executable, data_filename):
34 print >> sys.stderr, 'run %s' % executable
36 q = subprocess.Popen([executable, data_filename],
37 stdout=open('/dev/null', 'w'))
40 assert status == 0, status
43 def run_tests(executable, data_file, ordered=False, repeats=10, max_time=1e2):
47 while prev_time < max_time:
49 ts = numpy.zeros((repeats,), dtype=numpy.double)
50 for i in range(repeats):
51 generate_data(data_file, N, ordered=ordered)
52 ts[i] = run_test(executable, data_file.name)
59 if __name__ == '__main__':
63 p = optparse.OptionParser(
64 usage='%prog [options] executable', epilog=__doc__)
65 p.add_option('-r', '--repeats', dest='repeats', default=10, type='int',
66 help='Number of repeats to run at each N (%default).')
67 p.add_option('-m', '--max-time', dest='max_time', default=1e2,type='float',
68 help='Number of repeats to run at each N (%default).')
69 p.add_option('-p', '--plot', dest='plot', default=None,
70 help='Filename for a scaling plot (no plot is generated if this option is not set).')
72 options,args = p.parse_args()
76 data_file = tempfile.NamedTemporaryFile()
78 'executable': executable,
79 'data_file': data_file,
80 'repeats': options.repeats,
81 'max_time': options.max_time,
84 times = run_tests(ordered=False, **kwargs)
85 ordered_times = run_tests(ordered=True, **kwargs)
91 'ordered mean (s)', 'ordered std. dev. (s)',
92 'random mean (s)', 'random std. dev. (s)']
93 plots = dict([(c, []) for c in columns])
95 print '# sort times for %s' % executable
96 print '# %d repeats' % options.repeats
97 print '#%s' % '\t'.join(columns)
98 invalid = numpy.array(numpy.inf)
99 for key in sorted(set(times.keys() + ordered_times.keys())):
100 om = ordered_times.get(key, invalid).mean()
101 os = ordered_times.get(key, invalid).std()
102 m = times.get(key, invalid).mean()
103 s = times.get(key, invalid).std()
104 print '\t'.join([str(x) for x in [key, om, os, m, s]])
105 for c,x in zip(columns, [key, om, os, m, s]):
112 for c,color in zip(['ordered', 'random'], 'br'):
115 y=plots['%s mean (s)' % c],
116 yerr=plots['%s std. dev. (s)' % c],
117 fmt='%so-' % color, label=c)
118 a.set_title('sort times for %s' % executable)
122 a.set_ylabel('t (s)')
124 f.savefig(options.plot)