In article <[EMAIL PROTECTED]>, Steven Bethard <[EMAIL PROTECTED]> wrote: >Jeff Shannon wrote: >> 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: > >Thanks for the clarification. Here's the results for some functions >with internal exec statements: > > > cat fib.py >def fib1(n): > a, b = 0, 1 > while True: > a, b = b, a + b > yield a > > >exec """\ >def fib2(n): > a, b = 0, 1 > while True: > a, b = b, a + b > yield a >""" > >def fib3(n): > a, b = 0, 1 > while True: > exec "a, b = b, a + b" > yield a > >def fib4(n): > exec "a, b = 0, 1" > while True: > exec "a, b = b, a + b" > yield a > > > > > python -m timeit -s "import fib" "fib.fib1(100)" >1000000 loops, best of 3: 0.71 usec per loop > > > python -m timeit -s "import fib" "fib.fib2(100)" >1000000 loops, best of 3: 0.678 usec per loop > > > python -m timeit -s "import fib" "fib.fib3(100)" >1000000 loops, best of 3: 0.826 usec per loop > > > python -m timeit -s "import fib" "fib.fib4(100)" >1000000 loops, best of 3: 0.821 usec per loop > >I'm not sure I'd say they're *much* slower, but you're right; they're >definitely slower.
The thing is, that once you drop local-namespace optimization, the entire function gets slowed down, possibly by 40%: def fib5 (n): a, b, i = 0, 1, n while i > 0: a, b = b, a+b yield a i -= 1 def fib6 (n): exec "a, b, i = 0, 1, n" while i > 0: a, b = b, a+b yield a i -= 1 f:\home\mwilson\projects\python>python e:\bin\python23\lib\timeit.py -s "import fib" "[i for i in fib.fib5(100)]" 1000 loops, best of 3: 1.95e+003 usec per loop f:\home\mwilson\projects\python>python e:\bin\python23\lib\timeit.py -s "import fib" "[i for i in fib.fib6(100)]" 100 loops, best of 3: 2.82e+003 usec per loop Regards. Mel. -- http://mail.python.org/mailman/listinfo/python-list