Performance¶
Snippets on Python running performance.
why does Python code run faster in a function¶
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_FAST
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!