Performance in exec environnements

Jean-Baptiste Braun jbaptiste.braun at
Wed Jan 14 10:02:36 CET 2015

2015-01-13 22:48 GMT+01:00 Steven D'Aprano <
steve+comp.lang.python at>:

> So you have been comparing:
>     2
> versus
>     exec('1+1')
> The first case just fetches a reference to a pre-existing int object, and
> then deletes the reference. That's fast.
> The second case:
> - creates a new string '1+1'
> - does a global lookup to find the built-in exec function
> - passes the string to the function
> - the function then parses that string and compiles it to byte-code
> - runs the keyhole optimizer over it
> - and finally executes the byte code for "2", same as above.
> Only the last step is the same as your earlier test case.
What I don't understand is the ratio between test 2 / 4 and test 1 / 3.

Let 0.0229 sec be the execution time to read a bytecode (1st test).
Executing two times that bytecode takes 0.042 sec (test 3), which looks

Let 11.6 sec be the execution time to call the global exec, parse, do some
stuff and read a bytecode (test 2). I'm trying to understand why does doing
the same thing and reading one more bytecode is much longer (15.7 sec) in

> Bigger savings come from avoiding exec. Instead, try to use factory
> functions, closures, etc. If you give an example of what you are trying to
> generate with exec, we may be able to offer an alternative.
I think I'm going to compile before exec'ing.

What I'm trying to do is to map a transformation description in a markup
langage (XSLT) in python to improve execution time. Here is a
simplification of what it looks like :

  <xsl:when test="gender='M'">

Generated python :
if gender == 'M':
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Python-list mailing list