import csv from collections import namedtuple from dataclasses import dataclass @dataclass class DataClassRow: __slots__ = ['route', 'date', 'daytype', 'rides'] route: str date: str daytype: str rides: int class BasicRow: def __init__(self, route, date, daytype, rides): self.route = route self.date = date self.daytype = daytype self.rides = rides class SlotsRow: __slots__ = ['route', 'date', 'daytype', 'rides'] def __init__(self, route, date, daytype, rides): self.route = route self.date = date self.daytype = daytype self.rides = rides TupleRow = namedtuple('Row', ['route', 'date', 'daytype', 'rides']) def read_rides(filename, readfunc): """Read the bus ride data using a conversion function.""" with open(filename) as f: rows = csv.reader(f) next(rows) return [readfunc(row) for row in rows] def row_to_tuple(row): return (row[0], row[1], row[2], int(row[3])) def row_to_dict(row): return dict(route=row[0], date=row[1], daytype=row[2], rides=int(row[3])) def row_to_namedtuple(row): return TupleRow(row[0], row[1], row[2], int(row[3])) def row_to_class(row): return BasicRow(row[0], row[1], row[2], int(row[3])) def row_to_slotsclass(row): return SlotsRow(row[0], row[1], row[2], int(row[3])) def row_to_dataclass(row): return DataClassRow(route=row[0], date=row[1], daytype=row[2], rides=int(row[3])) if __name__ == '__main__': import sys import tracemalloc method = sys.argv[1] methods = { 'tuple': row_to_tuple, 'dict': row_to_dict, 'namedtuple': row_to_namedtuple, 'class': row_to_class, 'slots': row_to_slotsclass, 'dataclass': row_to_dataclass, } if method not in methods: print("unknown method") sys.exit(-1) tracemalloc.start() rows = read_rides('Data/ctabus.csv', methods[method]) print('Memory Use: Current %d, Peak %d;' % tracemalloc.get_traced_memory(), 'Method:', method)