Common Lisp (hereafter Lisp for concision) is
differently dynamic, not strictly more dynamic.
One quick example: standard-class objects in Lisp are mostly more dynamic than python objects[1] but structure-class objects are quite static, and compilers will use this to their advantage.
On top of this, functions in python are in fact objects; in python you can do this just fine:
def foo():
foo.bar = 3
def bar():
print(foo.bar)
There are obviously other ways to accomplish this in lisp, but the fact that someone
might do something like this can inhibit optimizations.
If you read the Lisp specification you will see dozens of places where they allow for opting out of dynamism in ways that help the compiler optimize. Type declarations are one and the fact that a function defined in a single file is considered to have a fixed definition for the scope of the file is another.
1: It's not quite as easy to add new slots to Lisp standard-class instances on the fly as it is to python class instances, but it's doable, and Lisp, of course, supports class redefinition in a way that few other languages (including Python) do.