Steven Bethard wrote:

Jeff Shannon wrote:

Note also that functions which use exec cannot use the static namespace optimization, and thus tend to be *much* slower than normal functions


In what circumstances will this be true?  I couldn't verify it:

[...]
exec """\
def fib2(n):
    a, b = 0, 1
    while True:
        a, b = b, a + b
        yield a
"""


I was referring to functions which have an internal exec statement, not functions which are created entirely within an exec -- i.e., something like this:

def fib3(n):
   a, b = 0, 1
   while True:
       exec "a, b = b, a + b"
       yield a

In your fib2(), when the function is defined, the entire contents of the local namespace can be determined (it's just that the function isn't "defined" until the exec statement is executed). In fib3(), when the function is defined, the parser can't determine what's happening inside the exec statement (it just sees a string, and that string may depend on other runtime circumstances which will happen latter), so it can't say for certain whether names other than a and b are created. (Consider the case where the string to be exec'ed is passed in as a function argument...)

Jeff Shannon
Technician/Programmer
Credit International

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to