Performance in exec environnements

Chris Angelico rosuav at gmail.com
Wed Jan 14 08:43:48 EST 2015


On Thu, Jan 15, 2015 at 12:38 AM, Jean-Baptiste Braun
<jbaptiste.braun at gmail.com> wrote:
> 2015-01-14 12:14 GMT+01:00 Chris Angelico <rosuav at gmail.com>:
>>
>> Would it be possible to do a one-off transformation of the entire XSLT
>> file into a Python module with a single function in it, and then every
>> time you need that XSLT, you import that module and call the function?
>> That would potentially be a lot quicker than exec(), *and* would be
>> much clearer - there'd be an actual file on the disk with your
>> generated Python code, and anyone could read it and understand what
>> it's doing.
>
> I've done some tests executing compiled generated python and it doesn't seem
> to be worth over processing xslt directly. What you propose could be a
> solution. In fact I'm not sure yet how it will be designed.
>
> Thank you for feedback anyway.

I don't know how often you need to re-process the same XSLT file, but
if you often run the same file (eg with different input data), then
you could create a .py file and import it, and then call it. Something
like this:

# Python code generated from some_file.xslt - DO NOT MODIFY
def process(gender):
    print('<title>')
    if gender == 'M':
        print('Mr')
    else:
        print('Mrs')
    print('</title>')


And then you'd use it thus:

import some_file
some_file.process(gender='M')

Although rather than using print(), it might be better to use yield:

# Python code generated from some_file.xslt - DO NOT MODIFY
def process(gender):
    yield '<title>'
    if gender == 'M':
        yield 'Mr'
    else:
        yield 'Mrs'
    yield'</title>'

And then usage would be:

import some_file
print("\n".join(some_file.process(gender='M')))

which gives you the flexibility of sending it somewhere other than
stdout, without monkey-patching the print function to do something
else.

ChrisA



More information about the Python-list mailing list