On Fri, 02 Nov 2007 17:08:06 -0500, Chris Mellon wrote: >>>> def test_func(): > ... pass > ... >>>> import new >>>> test_func2 = new.function(test_func.func_code, {}, "test_func2")
[snip results of timeit] > Why almost twice the calling overhead for a dynamic function? When I time the functions, I get a lot of variability. The minimum value is probably the best one to look at: >>> min(timeit.Timer("test_func()", ... "from __main__ import test_func").repeat(20)) 0.35664010047912598 >>> min(timeit.Timer("test_func2()", ... "from __main__ import test_func2").repeat(20)) 0.68138217926025391 Disassembling the code does not give any hints: >>> import dis >>> dis.dis(test_func) 2 0 LOAD_CONST 0 (None) 3 RETURN_VALUE >>> dis.dis(test_func2) 2 0 LOAD_CONST 0 (None) 3 RETURN_VALUE Which is what we should expect, because both functions have the same code: >>> test_func.func_code is test_func2.func_code True But try this: >>> test_func3 = new.function(test_func.func_code, ... globals(), 'test_func3') >>> min(timeit.Timer("test_func3()", ... "from __main__ import test_func3").repeat(20)) 0.35772204399108887 Hmmm... it looks like the difference in speed has to do with the globals, not the fact that it is created dynamically. I wonder why? -- Steven. -- http://mail.python.org/mailman/listinfo/python-list