thedoctar thedoctar - 1 month ago 5
Python Question

Why does Python code run faster in a function?

def main():
for i in xrange(10**8):
pass
main()


This piece of code in Python runs in (Note: The timing is done with the time function in BASH in Linux.)

real 0m1.841s
user 0m1.828s
sys 0m0.012s


However, if the for loop isn't placed within a function,

for i in xrange(10**8):
pass


then it runs for a much longer time:

real 0m4.543s
user 0m4.524s
sys 0m0.012s


Why is this?

Answer

You might ask why it is faster to store local variables than globals. This is a CPython implementation detail.

Remember that CPython is compiled to bytecode, which the interpreter runs. When a function is compiled, the local variables are stored in a fixed-size array (not a dict) and variable names are assigned to indexes. This is possible because you can't dynamically add local variables to a function. Then retrieving a local variable is literally a pointer lookup into the list and a refcount increase on the PyObject which is trivial.

Contrast this to a global lookup (LOAD_GLOBAL), which is a true dict search involving a hash and so on. Incidentally, this is why you need to specify global i if you want it to be global: if you ever assign to a variable inside a scope, the compiler will issue STORE_FASTs for its access unless you tell it not to.

By the way, global lookups are still pretty optimised. Attribute lookups foo.bar are the really slow ones!