On Tue, Aug 2, 2011 at 9:55 AM, Chris Angelico <ros...@gmail.com> wrote: > As I understand it, Python exclusively late-binds names; when you > define a function, nothing is ever pre-bound. This allows a huge > amount of flexibility (letting you "reach into" someone else's > function and change its behaviour), but it's flexibility that most > programs use seldom if at all. > > First off: Is there any way to request/cause some names to be bound > early?
Nope. Even if you "freeze" a variable's value via a closure, I don't believe it gets particularly optimized. <snip> > As an example of this difference, Pike uses early binding for some > things; when I did the perfect numbers testing in the other thread > (discussion thread, not thread of execution!), Pike performed > significantly better; I believe this is in part due to the formal > declarations of variables, and the consequential simplification of > local code, although since there are no globals being looked up here, > there's little to be gained from those. "in part". There are very likely additional factors at work here. Also, have you looked at Cython? I would guess that it can bypass a lot of the late binding. > Is this the realm of JIT compilation, or can it be done in regular CPython? Smart enough JITers can infer that late binding is not being exploited for certain variables and thus optimize them accordingly. Look how fast some of the JavaScript VMs are, despite JavaScript also being highly dynamic. The CPython devs are reluctant to accept the increased complexity and size of a JIT engine (see Unladen Swallow). Anything else would probably involve a similarly unpalatable level of complexity or require changing Python-the-language. I'm pretty sure optional early binding has been proposed in the past; try trawling the list archives. Cheers, Chris -- http://mail.python.org/mailman/listinfo/python-list