changing local namespace of a function
Bo Peng
bpeng at rice.edu
Sun Feb 6 01:58:02 EST 2005
Kent Johnson wrote:
> 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
I assumed that most of the time will be spent on N times execution of
myfunc.
>>> myfun = makeFunction('z = x + y', 'myfun')
>>> def fun2(d):
... # myfun = makeFunction('z = x + y', 'myfun')
... for i in xrange(0,N):
... myfun(d)
... del d['__builtins__']
>>> def fun21(d):
... myfun = makeFunction('z = x + y', 'myfun')
... for i in xrange(0,N):
... myfun(d)
... del d['__builtins__']
>>> profile.run('fun2(a)')
200003 function calls in 1.930 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.930 1.930 <string>:1(?)
100000 0.460 0.000 0.460 0.000 myfun:1(?)
1 0.000 0.000 1.930 1.930 profile:0(fun2(a))
0 0.000 0.000 profile:0(profiler)
100000 0.980 0.000 1.440 0.000 python-162616Io.py:4(f)
1 0.490 0.490 1.930 1.930 python-16261Ud0.py:1(fun2)
>>> profile.run('fun21(a)')
200004 function calls in 1.920 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.920 1.920 <string>:1(?)
100000 0.390 0.000 0.390 0.000 myfun:1(?)
1 0.000 0.000 1.920 1.920 profile:0(fun21(a))
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.000 0.000
python-162616Io.py:2(makeFunction)
100000 0.930 0.000 1.320 0.000 python-162616Io.py:4(f)
1 0.600 0.600 1.920 1.920 python-16261huu.py:1(fun21)
More information about the Python-list
mailing list