From c58dff8f29cd6e43dd80e4319b5315fb53e39752 Mon Sep 17 00:00:00 2001 From: Tal Einat Date: Fri, 4 Apr 2014 17:40:11 +0300 Subject: [PATCH] upgraded benchmarking code --- benchmarks/__main__.py | 49 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/benchmarks/__main__.py b/benchmarks/__main__.py index 9a35822..a8a222f 100644 --- a/benchmarks/__main__.py +++ b/benchmarks/__main__.py @@ -1,7 +1,48 @@ -import sys +import textwrap import timeit +import argparse +from benchmarks import benchmarks, search_functions -args = sys.argv[1:] -search_func_name, benchmark_name = args -timeit.main(['-s', 'from benchmarks import get_benchmark, run_benchmark; search_func, search_args = get_benchmark(%r, %r)' % (search_func_name, benchmark_name), 'run_benchmark(search_func, search_args)']) + +def print_results(timings, number, repeat, precision=3): + best = min(timings) + + usec = best * 1e6 / number + if usec < 1000: + x = "best of %d: %.*g usec per loop" % (repeat, precision, usec) + else: + msec = usec / 1000 + if msec < 1000: + x = "best of %d: %.*g msec per loop" % (repeat, precision, msec) + else: + sec = msec / 1000 + x = "best of %d: %.*g sec per loop" % (repeat, precision, sec) + + print("%d loops, " % number + x) + + +parser = argparse.ArgumentParser(description='Run fuzzysearch benchmarks.') + +parser.add_argument('search_function', choices=search_functions) +parser.add_argument('benchmark', choices=benchmarks) +parser.add_argument('-r', '--repetitions', type=int, default=5, + help='number of times to run the benchmark') +parser.add_argument('-n', '--number', type=int, default=10**5, + help='number of loop iterations to run in each repetition') + + +args = parser.parse_args() + +setup = textwrap.dedent('''\ + from benchmarks import get_benchmark, run_benchmark + search_func, search_args = get_benchmark({search_function!r}, + {benchmark!r}) +''').format(**args.__dict__) + +code = textwrap.dedent('''\ +run_benchmark(search_func, search_args) +''') + +timings = timeit.Timer(code, setup=setup).repeat(args.repetitions, args.number) +print_results(timings, args.number, args.repetitions)