Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accurate timing of functions in python

I'm programming in python on windows and would like to accurately measure the time it takes for a function to run. I have written a function "time_it" that takes another function, runs it, and returns the time it took to run.

def time_it(f, *args):     start = time.clock()     f(*args)     return (time.clock() - start)*1000 

i call this 1000 times and average the result. (the 1000 constant at the end is to give the answer in milliseconds.)

This function seems to work but i have this nagging feeling that I'm doing something wrong, and that by doing it this way I'm using more time than the function actually uses when its running.

Is there a more standard or accepted way to do this?

When i changed my test function to call a print so that it takes longer, my time_it function returns an average of 2.5 ms while the cProfile.run('f()') returns and average of 7.0 ms. I figured my function would overestimate the time if anything, what is going on here?

One additional note, it is the relative time of functions compared to each other that i care about, not the absolute time as this will obviously vary depending on hardware and other factors.

like image 491
Atilio Jobson Avatar asked May 20 '09 19:05

Atilio Jobson


People also ask

How accurate is python time time?

Output. Note that different systems will have different accuracy based on their internal clock setup (ticks per second). but it's generally at least under 20ms.

How do I check the processing time in python?

process_time() function in Python. time. process_time() function always returns the float value of time in seconds. Return the value (in fractional seconds) of the sum of the system and user CPU time of the current process.


1 Answers

Use the timeit module from the Python standard library.

Basic usage:

from timeit import Timer  # first argument is the code to be run, the second "setup" argument is only run once, # and it not included in the execution time. t = Timer("""x.index(123)""", setup="""x = range(1000)""")  print t.timeit() # prints float, for example 5.8254 # ..or.. print t.timeit(1000) # repeat 1000 times instead of the default 1million 
like image 106
Alex Martelli Avatar answered Sep 18 '22 15:09

Alex Martelli