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?
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.
With Python's built-in timeit module, you can measure the performance of your functions or lines of code in one easy step.
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.
timeit() function returns the number of seconds it took to execute the code.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With