HiveBrain v1.2.0
Get Started
← Back to all entries
gotchapythonCritical

Why does Python code run faster in a function?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
whyfunctionfasterpythondoesruncode

Problem

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?

Solution

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!

Here is small illustration on local variable efficiency.

Context

Stack Overflow Q#11241523, score: 592

Revisions (0)

No revisions yet.