|
| 1 | +import argparse |
| 2 | +import csv |
| 3 | + |
| 4 | + |
| 5 | +class _Writer: |
| 6 | + def __init__(self, add_bench): |
| 7 | + self.__add_bench = add_bench |
| 8 | + |
| 9 | + def __addinfo(self, bench, data): |
| 10 | + if self.__add_bench: |
| 11 | + return {'Benchmark': bench, **data} |
| 12 | + return data |
| 13 | + |
| 14 | + def benchdata(self, bench, data): |
| 15 | + self._benchdata(self.__addinfo(bench, data)) |
| 16 | + |
| 17 | + def finish(self): |
| 18 | + self._finish() |
| 19 | + |
| 20 | + |
| 21 | +class _CSVWriter(_Writer): |
| 22 | + def __init__(self, f, data: dict, fieldnames=None): |
| 23 | + add_bench = fieldnames is None or 'Benchmark' in fieldnames and 'Benchmark' not in data |
| 24 | + super().__init__(add_bench) |
| 25 | + |
| 26 | + if fieldnames is None: |
| 27 | + fieldnames = ['Benchmark', *data['Total'].keys()] |
| 28 | + |
| 29 | + self.__csv_writer = csv.DictWriter(f, fieldnames=fieldnames) |
| 30 | + self.__csv_writer.writeheader() |
| 31 | + |
| 32 | + def _benchdata(self, data): |
| 33 | + self.__csv_writer.writerow(data) |
| 34 | + |
| 35 | + def _finish(self): |
| 36 | + pass |
| 37 | + |
| 38 | + |
| 39 | +class _HumanWriter(_Writer): |
| 40 | + def __init__(self, f, data: dict, fieldnames=None): |
| 41 | + add_bench = fieldnames is None or 'Benchmark' in fieldnames and 'Benchmark' not in data |
| 42 | + super().__init__(add_bench) |
| 43 | + |
| 44 | + if fieldnames is None: |
| 45 | + fieldnames = ['Benchmark', *data['Total'].keys()] |
| 46 | + |
| 47 | + self.__f = f |
| 48 | + self.__fieldnames = fieldnames |
| 49 | + self.__data = {name: [f'{name}:'] for name in fieldnames} |
| 50 | + self.__num_entries = 1 |
| 51 | + |
| 52 | + def _benchdata(self, data): |
| 53 | + self.__num_entries += 1 |
| 54 | + for k, v in data.items(): |
| 55 | + self.__data[k].append(str(v)) |
| 56 | + |
| 57 | + def _finish(self): |
| 58 | + col_max = [max(len(self.__data[field][index]) for field in self.__fieldnames) |
| 59 | + for index in range(self.__num_entries)] |
| 60 | + for field in self.__fieldnames: |
| 61 | + for index, val in enumerate(self.__data[field]): |
| 62 | + self.__f.write(f'{val:{col_max[index]+1}}') |
| 63 | + self.__f.write('\n') |
| 64 | + |
| 65 | + |
| 66 | +def _write_data(writer: _Writer, data: dict): |
| 67 | + for bench, bench_data in data.items(): |
| 68 | + writer.benchdata(bench, bench_data) |
| 69 | + writer.finish() |
| 70 | + |
| 71 | + |
| 72 | +def write_csv(f, data: dict, *, fieldnames=None): |
| 73 | + _write_data(_CSVWriter(f, data, fieldnames), data) |
| 74 | + |
| 75 | + |
| 76 | +def write_human(f, data: dict, *, fieldnames=None): |
| 77 | + _write_data(_HumanWriter(f, data, fieldnames), data) |
| 78 | + |
| 79 | + |
| 80 | +def add_output_format_arg(parser: argparse.ArgumentParser, default='csv'): |
| 81 | + parser.add_argument('--format', default=default, choices=('csv', 'human'), |
| 82 | + help=f'Which format style to use (default: {default})') |
| 83 | + FORMAT_OPTIONS = { |
| 84 | + 'csv': write_csv, |
| 85 | + 'human': write_human, |
| 86 | + } |
| 87 | + |
| 88 | + if not hasattr(parser, '__analyze_post_process_parse_args__'): |
| 89 | + setattr(parser, '__analyze_post_process_parse_args__', {}) |
| 90 | + getattr(parser, '__analyze_post_process_parse_args__')['format'] = FORMAT_OPTIONS.__getitem__ |
0 commit comments