changing local namespace of a function
Kent Johnson
kent3737 at yahoo.com
Sat Feb 5 21:12:29 EST 2005
Bo Peng wrote:
>> Exec is slow since compiling the string and calls to globals() use a
>> lot of time. The last one is most elegant but __getattr__ and
>> __setattr__ are costly. The 'evil hack' solution is good since
>> accessing x and y takes no additional time.
>
>
> Previous comparison was not completely fair since I could pre-compile
> fun2 and I used indirect __setattr__. Here is the new one:
> >>> # solution two: use exec
> ... def makeFunction(funcStr, name):
> ... code = compile(funcStr, name, 'exec')
> ... def f(d):
> ... exec code in d
> ... return f
> ...
> >>> def fun2(d):
> ... myfun = makeFunction('z = x + y', 'myfun')
> ... for i in xrange(0,N):
> ... myfun(d)
> ... del d['__builtins__']
You are still including the compile overhead in fun2. If you want to see how fast the compiled code
is you should take the definition of myfun out of fun2:
myfun = makeFunction('z = x + y', 'myfun')
def fun2(d):
for i in xrange(0,N):
myfun(d)
del d['__builtins__']
Kent
More information about the Python-list
mailing list