<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Mar 19, 2014 at 7:45 PM, Nathaniel Smith <span dir="ltr">&lt;<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr"><div><div><div><div><div><div>Okay, I wrote a little script [1] to scan Python source files look for things like &#39;dot(a, dot(b, c))&#39; or &#39;dot(dot(a, b), c)&#39;, or the ndarray.dot method equivalents. So what we get out is:<br>

</div><div>- a count of how many &#39;dot&#39; calls there are<br></div><div>- a count of how often we see left-associative nestings: dot(dot(a, b), c)<br></div><div>- a count of how often we see right-associative nestings: dot(a, dot(b, c))<br>

<br></div><div>Running it on a bunch of projects, I get:<br></div></div></div></div></div></div><div><div><div><div><div><div class=""><br><span style="font-family:courier new,monospace">| project      | dots | left | right | right/left |<br>

|--------------+------+------+-------+------------|<br>| scipy        |  796 |   53 |    27 |       0.51 |<br>| nipy         |  275 |    3 |    19 |       6.33 |<br>| scikit-learn |  472 |   11 |    10 |       0.91 |<br>
| statsmodels  |  803 |   46 |    38 |       0.83 |<br>
| astropy      |   17 |    0 |     0 |        nan |<br>| scikit-image |   15 |    1 |     0 |       0.00 |<br>|--------------+------+------+-------+------------|<br>| total        | 2378 |  114 |    94 |       0.82 |</span><br>
</div></div></div></div></div></div></div></blockquote></div><br></div><div class="gmail_extra">Another way to visualize this, converting each contiguous &quot;chain&quot; of calls to np.dot into a parenthesized expression, and then counting how often we see each pattern.<br>
<span style="font-family:courier new,monospace"><br>      1943  (_ @ _)<br></span></div><div class="gmail_extra"><span style="font-family:courier new,monospace">       100  ((_ @ _) @ _) # left<br></span></div><div class="gmail_extra">
<span style="font-family:courier new,monospace">        86  (_ @ (_ @ _)) # right<br></span></div><div class="gmail_extra"><span style="font-family:courier new,monospace">         2  (_ @ ((_ @ _) @ _))<br></span></div><div class="gmail_extra">
<span style="font-family:courier new,monospace">         2  (((_ @ _) @ _) @ _) # left<br></span></div><div class="gmail_extra"><span style="font-family:courier new,monospace">         1  ((_ @ (_ @ _)) @ _)<br>         1  ((_ @ _) @ (_ @ _))<br>
         1  (((_ @ _) @ _) @ (_ @ _))<br>         1  ((_ @ ((_ @ _) @ _)) @ _)<br>         1  ((_ @ _) @ (_ @ (_ @ _)))<br></span><br></div><div class="gmail_extra">(This is pooling scipy/nipy/scikit-learn/statsmodels.) I&#39;ve noted the 3 different patterns that have a consistent associativity.<br>
<br></div><div class="gmail_extra">From this I&#39;m leaning towards the conclusions that:<br><br>- Expressions with complex parenthesization do happen, but probably not often enough to justify elaborate stuff like my &#39;chaining&#39; proposal -- only 8.7% of these cases involve more than one @.<br>
<br></div><div class="gmail_extra">- There&#39;s very little support here for the intuition that right-associativity is more useful than left-associativity on a day-to-day basis.<br></div><div class="gmail_extra"><br>-- <br>
Nathaniel J. Smith<br>Postdoctoral researcher - Informatics - University of Edinburgh<br><a href="http://vorpus.org" target="_blank">http://vorpus.org</a>
</div></div>