[Python-ideas] Interrogate alternate namespace keyword and concept

Prozacgod prozacgod at gmail.com
Sat Aug 15 01:53:41 CEST 2009


This makes sense, obviously you should compile it first, which when executed
should execute exactly the same as the original context python.

On Fri, Aug 14, 2009 at 3:29 PM, ilya <ilya.nikokoshev at gmail.com> wrote:

> That's a useful statistics, but the bottleneck is **only** because of
> parsing 'value +=5'.
>
> Here's how I time it:
>
> # insert my old program here...
>
>
> from timeit import Timer
> from codeop import compile_command
>
> def timing(something):
>    setup = 'from __main__ import test, interrogate, command, inc5'
>    best = sorted(Timer(something, setup).repeat(3, 1000))[0]
>    print('{0!r} -> {1:.3} ms'.format(something, best))
>    print('# test.value =', test.value)
>
> command = '''
> for i in range(10):
>    value += 1
> '''
>
> inc5 = compile_command(command)
>
> timing("interrogate(test, command)")
> timing(command.replace('value', 'test.value'))
> timing("interrogate(test, inc5)")
>
> Result:
>
> 15
> 'interrogate(test, command)' -> 0.0908 ms
> # test.value = 30015
> '\nfor i in range(10):\n    test.value += 1\n' -> 0.00408 ms
> # test.value = 60015
> 'interrogate(test, inc5)' -> 0.00469 ms
> # test.value = 90015
>
> so interrogate() with additional precompiling introduces very little
> overhead. Though I agree it's inconvenient to write functions as
> strings; I think someone smarter than me can find a way to do it like
> a regular function call.
>
>
>
> On Fri, Aug 14, 2009 at 3:17 PM, Steven D'Aprano<steve at pearwood.info>
> wrote:
> > On Fri, 14 Aug 2009 07:35:55 pm ilya wrote:
> >> Sorry, it's actually even easier; interrogate() is a one-liner:
> >>
> >> class Test:
> >>    '''Class to be interrogated.'''
> >>    def __init__(self, value):
> >>        self.value = value
> >>
> >> test = Test(10)
> >>
> >> def interrogate(what, how):
> >>    exec(how, what.__dict__)
> >
> > Apart from the security implications of exec(), it also takes a fairly
> > hefty performance hit. In Python 2.6:
> >
> >>>> from timeit import Timer
> >>>> setup = 'from __main__ import test, interrogate'
> >>>> Timer("interrogate(test, 'value += 5')", setup).repeat()
> > [18.503479957580566, 18.218451023101807, 18.218581914901733]
> >>>> Timer("test.value += 5", setup).repeat()
> > [0.33056807518005371, 0.33118104934692383, 0.33114814758300781]
> >
> > That's a factor of 55 times slower -- not precisely an optimization.
> >
> >
> >
> > --
> > Steven D'Aprano
> > _______________________________________________
> > Python-ideas mailing list
> > Python-ideas at python.org
> > http://mail.python.org/mailman/listinfo/python-ideas
> >
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>



-- 
-Prozacgod

"Prozac may heal the mind, but friends can mend the soul"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20090814/29c8ee72/attachment.html>


More information about the Python-ideas mailing list