![]() |
Newbie (but improving) - Passing a function name with parameters as a parameter
I am trying to time a function's execution, but I get 'TypeError:
'bool' object is not callable' when I try to run it. I suspect it is my calling of 'timeloop' with the function name 'lookup' and its associated variables or it could just be some stupid error on my part. function 'lookups' was working OK Any help will be appreciated. Thanks - Richard ===The offending Code ===== #!/usr/bin/python def timeloop(dofunction,iters=10): import datetime print "->-> Start of test", "LOOPS=", iters, datetime.datetime.now().ctime() for x in xrange(iters): print x dofunction() print "<-<- End of test", "LOOPS=", iters, datetime.datetime.now().ctime() def lookup(recs,patterns): matchcount = 0 pattcount = 0 for patt in patterns: if matchcount < pattcount: break pattcount += 1 for rec in recs: # print "PATT:", patt, " REC:", rec, " PATTCOUNT=", pattcount if patt in rec: matchcount +=1 break # print"MATCHCOUNT=",matchcount, "PATTCOUNT=", pattcount if matchcount == pattcount: return True else: return False myrecs = ['This is a title for Brian', 'this is detail one for brian', 'this is detail two for brian', 'this is another detail one for brian'] test1 = ['one', 'nomatch'] test2 = ['one', 'two'] test3 = ['title', 'two', 'nomatcheither'] mypatts = test1 timeloop(lookup(myrecs,mypatts), 10) |
Re: Newbie (but improving) - Passing a function name with parameters as a parameter
Try again ...
Just looking over your code quickly ... the function 'lookup' returns either True or False (a boolean) depending on whether matchcount == pattcount. Then in the declaration of the function 'timeloop' this return value gets bound to 'dofunction.' The subsequent call 'dofunction()' fails, because a boolean is not callable. Asun |
Re: Newbie (but improving) - Passing a function name with parameters as a parameter
On 10 Mai, 10:27, mosscliffe <mcl.off...@googlemail.com> wrote:
> I am trying to time a function's execution, Do you know the timeit module ? : Tool for measuring execution time of small code snippets Steffen |
Re: Newbie (but improving) - Passing a function name with parameters as a parameter
As Stephan said, you can investigate the timeit module. If you want to
test it your way, wrap up your function call in another function: On May 10, 9:27 am, mosscliffe <mcl.off...@googlemail.com> wrote: .... > def timeloop(dofunction,iters=10): .... > > def lookup(recs,patterns): .... > myrecs = ... > def test1(): lookup(myrecs, ['one', 'nomatch']) def test2(): lookup(myrecs, ['one', 'two']) > timeloop(test1, 10) Using timeit: t = timeit.Timer("lookup(myrecs, ['one', 'nomatch'])", "from __main__ import *") print t.timeit(10) -- Ant. |
Re: Newbie (but improving) - Passing a function name with parameters as a parameter
Many thanks. I think I see what you mean.
I will try 'timeit' as well. Aren't examples wonderful ? On 10 May, 11:42, Ant <ant...@gmail.com> wrote: > As Stephan said, you can investigate the timeit module. If you want to > test it your way, wrap up your function call in another function: > > On May 10, 9:27 am, mosscliffe <mcl.off...@googlemail.com> wrote: > ...> def timeloop(dofunction,iters=10): > ... > > > def lookup(recs,patterns): > > ... > > > myrecs = ... > > def test1(): > lookup(myrecs, ['one', 'nomatch']) > > def test2(): > lookup(myrecs, ['one', 'two']) > > > timeloop(test1, 10) > > Using timeit: > > t = timeit.Timer("lookup(myrecs, ['one', 'nomatch'])", "from __main__ > import *") > print t.timeit(10) > > -- > Ant. |
Re: Newbie (but improving) - Passing a function name with parametersas aparameter
"mosscliffe" <mcl.office@googlemail.com> wrote in message news:1178785638.736644.312970@e51g2000hsg.googlegr oups.com... Asun Friere pointed out the central flaw in your program. Since passing functions as arguments is an important concept, here, for any newbies who did not understand, is a restatement of the problem and the fix. | timeloop(lookup(myrecs,mypatts), 10) This does not pass the lookup function to timeloop. Rather it calls lookup and passes the boolean result. The attempt to 'call' that boolean gives |I am trying to time a function's execution, but I get 'TypeError: | 'bool' object is not callable' when I try to run it. | I suspect it is my calling of 'timeloop' with the function name | 'lookup' and its associated variables Yes. Make the following changes and all should be well. | def timeloop(dofunction,iters=10): def timeloop(func, args, iters=10) | import datetime | print "->-> Start of test", "LOOPS=", iters, | datetime.datetime.now().ctime() | for x in xrange(iters): | print x | dofunction() func(*args) | print "<-<- End of test", "LOOPS=", iters, | datetime.datetime.now().ctime() | | def lookup(recs,patterns): | matchcount = 0 | pattcount = 0 | for patt in patterns: | if matchcount < pattcount: | break | pattcount += 1 | for rec in recs: | # print "PATT:", patt, " REC:", rec, " PATTCOUNT=", pattcount | if patt in rec: | matchcount +=1 | break | # print"MATCHCOUNT=",matchcount, "PATTCOUNT=", pattcount | if matchcount == pattcount: | return True | else: | return False | | | | myrecs = ['This is a title for Brian', 'this is detail one for brian', | 'this is detail two for brian', 'this is another detail one for | brian'] | | test1 = ['one', 'nomatch'] | test2 = ['one', 'two'] | test3 = ['title', 'two', 'nomatcheither'] | | mypatts = test1 | | timeloop(lookup(myrecs,mypatts), 10) timeloop(lookup, (myrecs, mypaths), 10) Terry Jan Reedy |
Re: Newbie (but improving) - Passing a function name with parameters as aparameter
On May 10, 6:33 pm, "Terry Reedy" <tjre...@udel.edu> wrote:
> "mosscliffe" <mcl.off...@googlemail.com> wrote in message > > news:1178785638.736644.312970@e51g2000hsg.googlegr oups.com... > > Asun Friere pointed out the central flaw in your program. Since passing > functions as arguments is an important concept, here, for any newbies who > did not understand, is a restatement of the problem and the fix. > > | timeloop(lookup(myrecs,mypatts), 10) > > This does not pass the lookup function to timeloop. Rather it calls lookup > and passes the boolean result. The attempt to 'call' that boolean gives > > |I am trying to time a function's execution, but I get 'TypeError: > | 'bool' object is not callable' when I try to run it. > > | I suspect it is my calling of 'timeloop' with the function name > | 'lookup' and its associated variables > > Yes. Make the following changes and all should be well. > > | def timeloop(dofunction,iters=10): > > def timeloop(func, args, iters=10) > > | import datetime > | print "->-> Start of test", "LOOPS=", iters, > | datetime.datetime.now().ctime() > | for x in xrange(iters): > | print x > | dofunction() > > func(*args) > > | print "<-<- End of test", "LOOPS=", iters, > | datetime.datetime.now().ctime() > | > | def lookup(recs,patterns): > | matchcount = 0 > | pattcount = 0 > | for patt in patterns: > | if matchcount < pattcount: > | break > | pattcount += 1 > | for rec in recs: > | # print "PATT:", patt, " REC:", rec, " PATTCOUNT=", pattcount > | if patt in rec: > | matchcount +=1 > | break > | # print"MATCHCOUNT=",matchcount, "PATTCOUNT=", pattcount > | if matchcount == pattcount: > | return True > | else: > | return False > | > | > | > | myrecs = ['This is a title for Brian', 'this is detail one for brian', > | 'this is detail two for brian', 'this is another detail one for > | brian'] > | > | test1 = ['one', 'nomatch'] > | test2 = ['one', 'two'] > | test3 = ['title', 'two', 'nomatcheither'] > | > | mypatts = test1 > | > | timeloop(lookup(myrecs,mypatts), 10) > > timeloop(lookup, (myrecs, mypaths), 10) > A smaller change would be: timeloop(lambda: lookup(myrecs,mypatts), 10) |
| All times are GMT. The time now is 04:46 PM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.