#!/usr/bin/python # Output sample data for "interesting" entries. # Entry is deemed "interesting" if is shows up in top- # in any of the provided profiles. class benchmark: def __init__(self): self.data = {} self.interesting_symbols = {} import sys def main(argv): import csv import optparse import collections parser = optparse.OptionParser() num_interesting = 5 parser.add_option("-n", "--num", dest="num_interesting", default=5, help="number of interesting enteresting entries") parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") (options, args) = parser.parse_args() header = [] output_fieldnames = [] input_csvs = [] for arg in args: icsv = csv.reader(file(arg, 'r')) if not header: header = icsv.next() output_fieldnames = [header[0], header[1]] else: header2 = icsv.next() assert header2 == header csv_id = str.split(arg, ".csv")[0] for s in header[2:]: output_fieldnames += [csv_id + ":" + s] input_csvs.append(icsv) benchmarks = collections.OrderedDict() for icsv in input_csvs: cur_bmk="" for line in icsv: if cur_bmk != line[0]: # Entry for a new benchmark cur_interesting = num_interesting cur_bmk = line[0] if not benchmarks.has_key(cur_bmk): benchmarks[cur_bmk] = benchmark() else: # Continueing with current benchmark cur_interesting -= 1 symbol = line[1] if not benchmarks[cur_bmk].data.has_key(symbol): benchmarks[cur_bmk].data[symbol] = {} benchmarks[cur_bmk].data[symbol][icsv] = line[2:] if cur_interesting > 0: if not benchmarks[cur_bmk].interesting_symbols.has_key(symbol): benchmarks[cur_bmk].interesting_symbols[symbol] = 0 benchmarks[cur_bmk].interesting_symbols[symbol] += cur_interesting output_csv = csv.writer(sys.stdout) output_csv.writerow(output_fieldnames) for cur_bmk in benchmarks: for symbol, total_count in sorted(benchmarks[cur_bmk].interesting_symbols.iteritems(), key=lambda (k,v): (v,k), reverse=True): row = [cur_bmk, symbol] for icsv in input_csvs: key = (icsv, cur_bmk, symbol) if benchmarks[cur_bmk].data[symbol].has_key(icsv): line2 = benchmarks[cur_bmk].data[symbol][icsv] else: line2 = [] for s in header[2:]: line2.append("0") row += line2 output_csv.writerow(row) if __name__ == "__main__": main(sys.argv[1:])