jykim16
2/1/2018 - 11:36 PM

Profiling Python

import time

# use to time functions
# timer = timewith('fancy thing')
# expensive_function()
# timer.checkpoint('done with something')
# prints something like:
# fancy thing done with something took 0.582462072372 seconds
# fancy thing done with something else took 1.75355315208 seconds
# fancy thing finished took 1.7535982132 seconds
class timewith():
    def __init__(self, name=''):
        self.name = name
        self.start = time.time()

    @property
    def elapsed(self):
        return time.time() - self.start

    def checkpoint(self, name=''):
        print '{timer} {checkpoint} took {elapsed} seconds'.format(
            timer=self.name,
            checkpoint=name,
            elapsed=self.elapsed,
        ).strip()

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self.checkpoint('finished')
        pass

# Use as decorator to see timing of functions
# @timefunc
# def expensive_function():
#     for x in get_number():
#         i = x ^ x ^ x
#     return 'some result!'
# # prints "expensive_function took 0.72583088875 seconds"
# result = expensive_function()

def timefunc(f):
    def f_timer(*args, **kwargs):
        start = time.time()
        result = f(*args, **kwargs)
        end = time.time()
        print f.__name__, 'took', end - start, 'time'
        return result
    return f_timer