Adding a Par construct to Python?

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Wed May 20 07:57:38 CEST 2009


On Tue, 19 May 2009 21:41:08 -0700, Aaron Brady wrote:

> On May 19, 11:20 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:
>> Steven D'Aprano <ste... at REMOVE.THIS.cybersource.com.au> writes:
>> > (4) the caller is responsible for making sure he never shares data
>> > while looping over it.
>>
>> > I don't think I've missed any possibilities. You have to pick one of
>> > those four.
>>
>> I wonder if the compiler can check that a given function doesn't change
>> any data.  Then:
>>
>> @pure
>> def f(x):
>>    return x*sqrt(x) + 3      # does not mutate any data
>>
>> @pure
>> def g(x): ...                # likewise
>>
>> s = parallel_dot_product(parallel_map(f, vec), parallel_map(g,vec))
> 
> You can do the basics of this using the 'ast' module.  Just check that
> no nodes in the ast tree are Assign nodes, including augmented assign. 
> Then 'f' is defined as:
> 
> f= pure( '''
>    return x*sqrt(x) + 3      # does not mutate any data
> ''' )
> 
> Untested.  


Can you explain how you can tell that there are no side-effects from 
x*sqrt(x)+3 ? What if I have this?

class Funny(object):
    def __add__(self, other):
        global parrot
        parrot += 1
        return 5 + other

x = Funny()




-- 
Steven



More information about the Python-list mailing list