import timeit from functools import total_ordering class Baseline: def __init__(s, v): s.v = v def __lt__(s, o): return s.v < o.v def __le__(s, o): return s.v <= o.v def __gt__(s, o): return s.v > o.v def __ge__(s, o): return s.v >= o.v @total_ordering class UsingDecorator: def __init__(s, v): s.v = v def __lt__(s, o): return s.v < o.v def bench(stmt): setup_baseline = 'from __main__ import Baseline as A; a = A(1); b = A(2)' setup_decorator = 'from __main__ import UsingDecorator as A; a = A(1); b = A(2)' number = 100000 baseline = min(timeit.repeat(stmt, setup_baseline, repeat=7, number=number)) / number decorated = min(timeit.repeat(stmt, setup_decorator, repeat=7, number=number)) / number slowdown = float(decorated) / baseline print('%-6s %.3f %.3f x%.2f' % (stmt, baseline*1e6, decorated*1e6, slowdown)) bench('a < b') bench('b < a') bench('a >= b') bench('b >= a') bench('a <= b') bench('b <= a') bench('a > b') bench('b > a')