I'm struggling with this using timeit and was wondering if anyone had any tips
Basically I have a function(that I pass a value to) that I want to test the speed of and created this:
if __name__=='__main__':
from timeit import Timer
t = Timer(superMegaIntenseFunction(10))
print t.timeit(number=1)
but when I run it, I get weird errors like coming from the timeit module.:
ValueError: stmt is neither a string nor callable
If I run the function on its own, it works fine. Its when I wrap it in the time it module, I get the errors(I have tried using double quotes and without..sameoutput).
any suggestions would be awesome!
Thanks!
One way to do it would be by using partial so that the function, 'superMegaIntenseFunction' is used as a callable (ie without the ()) in the timer or directly inside timeit.timeit. Using partial will pass the argument to the function when it will be call by the timer.
Timer(superMegaIntenseFunction(10))
means "callsuperMegaIntenseFunction(10)
, then pass the result toTimer
". That's clearly not what you want.Timer
expects either a callable (just as it sounds: something that can be called, such as a function), or a string (so that it can interpret the contents of the string as Python code).Timer
works by calling the callable-thing repeatedly and seeing how much time is taken.Timer(superMegaIntenseFunction)
would pass the type check, becausesuperMegaIntenseFunction
is callable. However,Timer
wouldn't know what values to pass tosuperMegaIntenseFunction
.The simple way around this, of course, is to use a string with the code. We need to pass a 'setup' argument to the code, because the string is "interpreted as code" in a fresh context - it doesn't have access to the same
globals
, so you need to run another bit of code to make the definition available - see @oxtopus's answer.With
lambda
(as in @Pablo's answer), we can bind the parameter10
to a call tosuperMegaIntenseFunction
. All that we're doing is creating another function, that takes no arguments, and callssuperMegaIntenseFunction
with10
. It's just as if you'd useddef
to create another function like that, except that the new function doesn't get a name (because it doesn't need one).You should be passing a string. i.e.
Make it a callable:
Should work
A note for future visitors. If you need to make it work in
pdb
debugger, andsuperMegaIntenseFunction
is not in the global scope, you can make it work by adding toglobals
: