Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!1.eu.feeder.erje.net!news.swapon.de!news.panservice.it!feed.xsnews.nl!border02.ams.xsnews.nl!feeder04.ams.xsnews.nl!feeder03.ams.xsnews.nl!abp001.ams.xsnews.nl!frontend-F09-15.ams.news.kpn.nl From: Cecil Westerhof Newsgroups: comp.lang.python Subject: Re: Function to show time to execute another function Organization: Decebal Computing References: <87k2vgowco.fsf@Equus.decebal.nl> <55740ecf$0$12978$c3e8da3$5496439d@news.astraweb.com> X-Face: "(y8cC@tg_12{">GF'UXTW]FHI2wMiZNrnf'1EFQ&O#$m:f#O7+7}kR,v+Pti8=Vi/Z"g^?b"E X-Homepage: http://www.decebal.nl/ Date: Sun, 07 Jun 2015 14:14:29 +0200 Message-ID: <87y4jvoguy.fsf@Equus.decebal.nl> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) Cancel-Lock: sha1:4xnXFb9w07tv4jZZuYuzCX+acTM= MIME-Version: 1.0 Content-Type: text/plain Lines: 65 NNTP-Posting-Host: 81.207.62.244 X-Trace: 1433680194 news.kpn.nl 19701 81.207.62.244@kpn/81.207.62.244:56745 Xref: csiph.com comp.lang.python:92239 On Sunday 7 Jun 2015 11:28 CEST, Steven D'Aprano wrote: > On Sun, 7 Jun 2015 04:39 pm, Cecil Westerhof wrote: > >> Sometimes I just want to know how much time a function takes, but >> at the same time I also want the result of the function. For this I >> wrote the following function: def time_test(function, *args): >> startTime = time.time() results = function(*args) endTime = >> time.time() print('It took {0} seconds'.format(endTime - >> startTime)) return results > > > There is a lot of subtlety in timing functions on modern day > computers. What you measure there includes the time taken to lookup > the names "function" and "args" (although that ought to be very > quick) and to expand out *args (not quite so quick). > > More importantly, it will also be less accurate on Windows systems, > and may include time during which the operating system is running > other background tasks. It makes no attempt to allow for whether > code is in the CPU cache or not. And what if the garbage collector > happens to run in the middle of your test? > > Timing code these days is subtle and complicated! > > Depending on what function actually does, those complications may, > or may not, make a real difference. If function() does a lot of work > (say, at least one second) then what I have said is probably > completely irrelevant and you can ignore it. For those cases, your > function is perfectly fine, although I prefer to use a with > statement interactively. Of course I can still call a function, but > I don't *have* to call a function. Next time I should give more background. ;-) This function is only mend to get an indication of the needed time and in my opinion is only useful from ate least 5 seconds. If you want real measurements you should use timeit I think. > Here is a simple example: > > http://code.activestate.com/recipes/577896-benchmark-code-with-the-with-statement/ That looks quite interesting. I think I will use that in my function. I still think the function is handy, because you need less code with it. > But if your function takes less than, say, 1 millisecond, then your > timing results are probably just meaningless random numbers, > affected more by the other ten thousand processes running on your > computer than by the Python code itself. > > In that case, you should learn how to use the timeit module. It's a > little complex, but worth it for timing small code snippets. I knew that. It is just to use before using the heavy guns (and also wanting the result of the function). But I should be more explicit next time. -- Cecil Westerhof Senior Software Engineer LinkedIn: http://www.linkedin.com/in/cecilwesterhof