Passing function objects to timeit
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Sun Mar 30 00:27:18 EDT 2008
En Sun, 30 Mar 2008 00:20:34 -0300, Steven D'Aprano
<steve at REMOVE-THIS-cybersource.com.au> escribió:
> On Sat, 29 Mar 2008 21:12:33 -0300, Gabriel Genellina wrote:
>
>> def main():
>> global func
>> func = factory()
>> return timeit.Timer('func()', 'from __main__ import func').timeit()
>
> Alas, this does not work, because all the Timer instances share the same
> state.
Second try:
<code>
# timeanyfunc.py
from timeit import Timer
from itertools import count
_counter = count()
def timeanyfunc(fn, *args, **kw):
def wrapper(fn=fn, args=args, kw=kw):
return fn(*args, **kw)
wrappername = 'wrapper%d' % _counter.next()
globals()[wrappername] = wrapper
return Timer("%s()" % wrappername, "from %s import %s" % (__name__,
wrappername))
</code>
Horrible, I know. Those wrapper1,wrapper2,wrapper3... keep growing with
each call. But it's the only way I could find, at least without changing
the code template used by timeit.
py> from timeanyfunc import timeanyfunc
py>
py> def functionA(arg):
... print "Function A",arg
...
py> def functionB(arg):
... print "Function B",arg
...
py> def test_timer(func1, func2):
... T1 = timeanyfunc(func1, "arg1")
... T2 = timeanyfunc(func2, "arg2")
... print "Calling %s" % func1.__name__
... T1.repeat(3, 1)
... print "Calling %s" % func2.__name__
... T2.repeat(3, 1)
...
py> test_timer(functionA, functionB)
Calling functionA
Function A arg1
Function A arg1
Function A arg1
Calling functionB
Function B arg2
Function B arg2
Function B arg2
--
Gabriel Genellina
More information about the Python-list
mailing list