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?
This works:
The problem is that your strings that you’re passing as
setupandfoo_1, etc. are indented since you’ve lined them up with your indented code inside the function. However, when that string gets executed bytimeit, 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…as the first thing in your interactive interpreter session.