I understand that calling eval() on a string is going to be slow, since the string has to be parsed, compiled, and then executed.
But why is it so slow when called on function __code__ objects and pre- compiled byte-code? Here are the tests I ran: # calling a regular function python3.5 -m timeit -s "f = lambda: 99" "f()" # evaluating a function code object python3.5 -m timeit -s "f = (lambda: 99).__code__" "eval(f)" # estimate the overhead of the eval name lookup python3.5 -m timeit "eval" # evaluating a pre-compiled byte-code object python3.5 -m timeit -s "f = compile('99', '', 'eval')" "eval(f)" # evaluating a string python3.5 -m timeit "eval('99')" And the results on my computer: # call a regular function 1000000 loops, best of 3: 0.245 usec per loop # evaluate the function __code__ object 1000000 loops, best of 3: 1.16 usec per loop # overhead of looking up "eval" 10000000 loops, best of 3: 0.11 usec per loop which means it takes four times longer to execute the code object alone, compared to calling the function object which executes the code object. Why so slow? # evaluate the pre-compiled byte-code 1000000 loops, best of 3: 1.13 usec per loop # parse, compile and evaluate a string 10000 loops, best of 3: 23.5 usec per loop That one, at least, makes perfect sense to me :-) -- Steve -- https://mail.python.org/mailman/listinfo/python-list