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 Comments [Atom]