Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can we run multiple functions each with timeit in the same module

Tags:

python

timeit

I would like to write multiple functions in the same Python module, each of which is a separate profiling test using timeit, so that I can use command line argument to specify which one to run. A naive example (profiling.py) would be:

import sys
import timeit

def foo():

    setup = """
    import random
    """

    foo_1 = """
    for i in range(1000):
        random.randint(0, 99) + random.randint(0, 99)
    """

    foo_2 = """
    for i in range(1000):
        random.randint(0, 99) + random.randint(0, 99)
    """

    foo_3 = """
    for i in range(1000):
        random.randint(0, 99) + random.randint(0, 99)
    """

    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000)
    print 'foo_2', timeit.Timer(foo_2, setup).timeit(1000)
    print 'foo_3', timeit.Timer(foo_3, setup).timeit(1000)

if __name__ == '__main__':
    if (len(sys.argv) > 1):
        if (sys.argv[1] == 'foo'):
            foo()
    else:
        print 'Which profiling do you want to run?'
        print 'available:'
        print '    foo'

However, when I try python profiling.py foo, I get error like the following:

foo_1
Traceback (most recent call last):
  File "profiling.py", line 32, in <module>
    foo()
  File "profiling.py", line 25, in foo
    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/timeit.py", line 136, in __init__
    code = compile(src, dummy_src_name, "exec")
  File "<timeit-src>", line 6
    _t0 = _timer()
                 ^
IndentationError: unindent does not match any outer indentation level

I have searched for the usual space/tab indention error in the code, but didn't find any. Hence I wonder if it is because I wrap a timeit test inside a function, and this is not allowed?

like image 981
MLister Avatar asked Jun 04 '12 19:06

MLister


People also ask

How do you repeat Timeit?

repeat() takes an additional parameter, repeat (default value = 5). This returns a list of execution times of the code snippet repeated a number of times. As expected, the time taken by bubble sort is much more than the built-in sorted() function.

Can you use Timeit on a function in Python?

With Python's built-in timeit module, you can measure the performance of your functions or lines of code in one easy step.

What is the Timeit module used for?

This module provides a simple way to time small bits of Python code. It has both a Command-Line Interface as well as a callable one. It avoids a number of common traps for measuring execution times.

Does Timeit return time in seconds?

timeit() function returns the number of seconds it took to execute the code.


1 Answers

This works:

import sys
import timeit

def foo():

    setup = """
import random
"""

    foo_1 = """
for i in range(1000):
    random.randint(0, 99) + random.randint(0, 99)
"""

    foo_2 = """
for i in range(1000):
    random.randint(0, 99) + random.randint(0, 99)
"""

    foo_3 = """
for i in range(1000):
    random.randint(0, 99) + random.randint(0, 99)
"""

    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000)
    print 'foo_2', timeit.Timer(foo_2, setup).timeit(1000)
    print 'foo_3', timeit.Timer(foo_3, setup).timeit(1000)

if __name__ == '__main__':
    if (len(sys.argv) > 1):
        if (sys.argv[1] == 'foo'):
            foo()
    else:
        print 'Which profiling do you want to run?'
        print 'available:'
        print '    foo'

The problem is that your strings that you're passing as setup and foo_1, etc. are indented since you've lined them up with your indented code inside the function. However, when that string gets executed by timeit, it raises the indentation error you see because the code should not be indented. This is essentially the same thing that would happen if you tried...

exec("    import sys")

as the first thing in your interactive interpreter session.

like image 113
mgilson Avatar answered Sep 30 '22 04:09

mgilson