Source code for spike.util.counter
#!/usr/bin/env python
# encoding: utf-8
"""
counter.py
This utility declare two useful decorators
counting and timeit
usage :
@counting
def func()
...
counting :
The number of time the decorated function is called is counted, and the count is printed at the end of the prgm execution
timeit :
As counting, but additionally, the total (elapsed) time spent in the function is totalized and printed at the end of the prgm
Created by Marc-André on 2012-11-05.
Copyright (c) 2012 IGBMC. All rights reserved.
"""
################################################################################
# UTILITIES
from __future__ import print_function
[docs]class Counter(object):
"""
defines an incremental counter
c = Counter() # actually defines a function c()
v = c() # each time c() is called, the internal value is incremented
value is found at c.count
"""
def __init__(self, ini=0):
self.count = ini
def __call__(self):
self.count += 1
return self.count
[docs]def counting(func_to_decorate):
"""define a decorator that count the nmber of function/method call, and display at the end of the prgm"""
import functools
import atexit
count = Counter()
@atexit.register
def report():
print("function %s called %d times"%(func_to_decorate.__name__, count.count))
@functools.wraps(func_to_decorate)
def wrapper(*args, **kw):
result = func_to_decorate(*args, **kw)
count()
return result
return wrapper
[docs]def timeit(func_to_decorate):
"""
define a decorator that count the total time passed in the function/method call, and display at the end of the prgm
NOT PRECISE for very short times
"""
import functools
import atexit
import time
count = Counter()
count.tim = 0.0
@atexit.register
def report():
if count.count>0:
print("function %s time : %f sec called %d times time/call : %f sec"%(func_to_decorate.__name__, count.tim, count.count, count.tim/count.count))
else:
print("function %s called %d times"%(func_to_decorate.__name__, count.count))
@functools.wraps(func_to_decorate)
def wrapper(*args, **kw):
t0 = time.time()
result = func_to_decorate(*args, **kw)
count.tim += time.time() - t0
count()
return result
return wrapper
#### TESTS and examples #############
[docs]def main():
"""
should print :
function test2 time : 3.000320 sec called 3 time/call : 1.000107 sec
function test called 13 times
"""
# define functions locally in main() so as not to clutter the callers name space
@counting
def test(x):
"example for counting"
return x
@timeit
def test2(t):
"example for timeit"
import time
time.sleep(t)
return test(t)
for i in range(10):
test(i)
for i in range(3):
test2(i)
if __name__ == '__main__':
main()