As a followup to my last blog post on timings, I present the following function which works as both a decorator and a context manager.
# timethis.py import time from contextlib import contextmanager def timethis(what): @contextmanager def benchmark(): start = time.time() yield end = time.time() print("%s : %0.3f seconds" % (what, end-start)) if hasattr(what,"__call__"): def timed(*args,**kwargs): with benchmark(): return what(*args,**kwargs) return timed else: return benchmark()
Here is a short demonstration of how it works:
# Usage as a context manager with timethis("iterate by lines (UTF-8)"): for line in open("biglog.txt",encoding='utf-8'): pass # Usage as a decorator @timethis def iterate_by_lines_latin_1(): for line in open("biglog.txt",encoding='latin-1'): pass iterate_by_lines_latin_1()
If you run it, you'll get output like this:
bash % python3 timethis.py iterate by lines (UTF-8) : 3.762 seconds <function iterate_by_lines_latin_1 at 0x100537958> : 3.513 seconds
Naturally, this bit of code would be a good thing to bring into your next code review just to make sure people are actually paying attention.
08/01/2009 - 09/01/2009 09/01/2009 - 10/01/2009 10/01/2009 - 11/01/2009 11/01/2009 - 12/01/2009 12/01/2009 - 01/01/2010 01/01/2010 - 02/01/2010 02/01/2010 - 03/01/2010 04/01/2010 - 05/01/2010 05/01/2010 - 06/01/2010 07/01/2010 - 08/01/2010 08/01/2010 - 09/01/2010 09/01/2010 - 10/01/2010 12/01/2010 - 01/01/2011 01/01/2011 - 02/01/2011 02/01/2011 - 03/01/2011 03/01/2011 - 04/01/2011 04/01/2011 - 05/01/2011 05/01/2011 - 06/01/2011 08/01/2011 - 09/01/2011 09/01/2011 - 10/01/2011 12/01/2011 - 01/01/2012 01/01/2012 - 02/01/2012 02/01/2012 - 03/01/2012 03/01/2012 - 04/01/2012 07/01/2012 - 08/01/2012 01/01/2013 - 02/01/2013 03/01/2013 - 04/01/2013 06/01/2014 - 07/01/2014 09/01/2014 - 10/01/2014
Subscribe to Posts [Atom]