Timing a Function in Python
Question: I'm trying to time two different functions in python.

The first:

    
    
    import cProfile
    def bin_search(A, first,last, target):
    #returns index of target in A, if present
    #returns -1 if target is not present in A
    if first > last:
        return -1
    else:
        mid = (first+last)/2
        if A[mid]==target:
            return mid
        elif A[mid]>target:
            return bin_search(A,first,mid-1,target)
        else:
            return bin_search(A,mid+1,last,target)
    

the second

    
    
    def trin_search(A,first,last,target):
    #returns index of target in A, if present
    #returns -1 if target is not present in A
    if target> last or target<first:
        return -1
    if first>last:
        return -1
    else:
        one_third=first+(last-first)/3
        two_thirds=first+2*(last-first)/3
        if A[one_third]==target:
            return one_third
        elif A[one_third]>target:
            #search the left-hand third
            return trin_search(A,first, one_third,target)
        elif A[two_thirds]==target:
            return two_thirds
        elif A[two_thirds]>target:
            #search the middle third
            return trin_search(A,one_third+1,two_thirds-1,target)
        else:
            #search the right-hand third
            return trin_search(A,two_thirds+1,last,target)
    

I'm trying to time them using the cprofile.run() method. I call:

    
    
    cprofile.run('trin_search(newlist, newlist[0], newlist[-1], 17)')
    

and

    
    
    cprofile.run('bin_search(newlist, newlist[0], newlist[-1], 17)')
    

with the results for the first:

    
    
    6 function calls (4 primitive calls) in 0.000 seconds
    
    Ordered by: standard name
    
    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
      3/1    0.000    0.000    0.000    0.000 Jan 18.py:16(trin_search)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.000    0.000 profile:0(trin_search(newlist, newlist[0], newlist[-1], 17))
    

and the second

    
    
    7 function calls (3 primitive calls) in 0.000 seconds
    
    Ordered by: standard name
    
    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
      5/1    0.000    0.000    0.000    0.000 Jan 18.py:2(bin_search)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}    
    

How is it possible that they take 0 time to operate?

Cheers,


Answer: As already pointed out by other use the `timeit` module, here's an example how
to time a function with parameters:

    
    
    import timeit
    
    arg = 10
    
    def foo(arg):
        return arg**arg
    
    t=timeit.Timer("foo(arg)","from __main__ import foo, arg")
    print t.timeit(5)
    

Note that you have to import both the function and the variables that you are
using in your function call.

Also, I would suggest that you use [IPython](http://ipython.org/) where you
have _"magic commands"_ so you can simply do `%timeit foo(arg)`.

* * *

For your example, this should work:

    
    
    t=timeit.Timer("bin_search(newlist, newlist[0], newlist[-1], 17)",
                           "from __main__ import bin_search, newlist") 
    

