This one blew me away. You can store state in a function, just like you would any object. These are called function attributes. As an aside, I also learned that using a try: except clause is ever slightly so faster than an if.
Giving us:
def foo(a):
try:
foo.b += a
except AttributeError:
foo.b = a
return foo.b
def foo2(a):
if hasattr(foo2, 'b'):
foo2.b += a
else:
foo2.b = a
return foo2.b
if __name__ == '__main__':
print [foo(x) for x in range(10)]
print [foo2(x) for x in range(10)]
"""
python -mtimeit -s'import test' '[test.foo(x) for x in range(100)]'
python -mtimeit -s'import test' '[test.foo2(x) for x in range(100)]'
"""
Giving us:
python test.py [0, 1, 3, 6, 10, 15, 21, 28, 36, 45] [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
python -mtimeit -s'import test' '[test.foo(x) for x in range(100)]' -> 10000 loops, best of 3: 29.4 usec per loop python -mtimeit -s'import test' '[test.foo2(x) for x in range(100)]' -> 10000 loops, best of 3: 39.1 usec per loop
Comments
Post a Comment