<div dir="ltr">> <span style="font-family:arial,sans-serif;font-size:13px">The problem of a loop being that its semantics are too generic to make</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">anything even remotely close to such an assumption.</span><div>

<span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">I think it's the opposite problem, really: the semantics (repeatedly calling .next() on iter(...)) is too specific, and is incompatible with what you want. What you want is a generic map() function which encodes the semantics (independent updates) that you want, and map() is trivially parallelizable.</span></div>

</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jan 8, 2014 at 10:53 AM, Masklinn <span dir="ltr"><<a href="mailto:masklinn@masklinn.net" target="_blank">masklinn@masklinn.net</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On 2014-01-08, at 18:47 , Enric Tejedor <<a href="mailto:enric.tejedor@bsc.es">enric.tejedor@bsc.es</a>> wrote:<br>


> Correct, this is indeed a problem. It would be tricky to make this work<br>
> in the general case.<br>
><br>
> In a simpler scenario, we could assume that iterations won't update the<br>
> same data.<br>
> On the other hand, to prevent the UnboundLocalError, the variables<br>
> needed inside the loop could be passed to the decorator and appear in<br>
> the loop function's signature.<br>
><br>
> results = [0] * 10<br>
><br>
> @parallel(range(10), results)<br>
> def loop(i, results):<br>
>       results[i] = some_computation(i)<br>
<br>
</div>At this point you don't really need a decorator anymore, this is an<br>
odd-ish way to write `results = map(some_computation, range(10))`, and<br>
as others have noted the standard library already has a parallelized<br>
version thereof:<br>
<a href="http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map" target="_blank">http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map</a><br>


<div class="im"><br>
> Then the decorator would be:<br>
><br>
> def parallel(*args):<br>
>   iterable = args[0]<br>
>   params = args[1:]<br>
><br>
>   def call(func):<br>
>       # create parallel invocations of func with iterable and params<br>
><br>
>   return call<br>
><br>
> I think this solution would work if you wanted to do things like<br>
> performing independent updates on a list.<br>
<br>
</div>The problem of a loop being that its semantics are too generic to make<br>
anything even remotely close to such an assumption.<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</div></div></blockquote></div><br></div>