[Python-ideas] Fwd: [RFC] draft PEP: Dedicated infix operators for matrix multiplication and matrix power
Aaron Meurer
asmeurer at gmail.com
Sat Mar 15 01:48:46 CET 2014
On Friday, March 14, 2014 7:46:11 PM UTC-5, Aaron Meurer wrote:
On Friday, March 14, 2014 4:21:12 PM UTC-5, Nathaniel Smith wrote:
> On Fri, Mar 14, 2014 at 5:53 PM, Guido van Rossum <gu... at python.org>
> wrote:
>
>> > I have now read the PEP, and I think it's good. I think it's a waste of
> time
>
>> > to keep bikeshedding on the choice of operator -- @ is the best
> compromise.
>
>> > I do have a few specific notes:
>
>> >
>
>> > - Right associativity is not unheard of in Python. E.g. **. If you
>
>> > think that for other reasons @ should be right associative, don't
>
>> > let Python's tradition stop you. But then you need to decide which
>
>> > of * and @ binds more tightly -- e.g. does a*b at c mean a*(b at c) or
>
>> > (a*b)@c? And if you choose the latter, it follows that a at b*c means
>
>> > a@(b*c) -- is that okay? (And similar examples exist for the other
>
>> > choice.)
>
>>
> Like Robert I have the suspicion that the best option is to make @
>
>> right-associative and place it just above (more tightly binding) than
>
>> *. But I'll poll numpy-discussion and friends and see if anyone has
> ideas for more objective measures.
>
I guess a common case would be a*B at x, where a is a scalar. Is it more
efficient or numerically stable to evaluate that one way or the other?
Aaron Meurer
> > - Did you consider a duck-typing (is that the word?) attribute?
>
>> > E.g. a*b is elementwise multiplication; a.M*b must be used for
>
>> > matrix multiplication. (Your use of .T as "transpose" made me think
>
>> > of this.) Of course the question is, can you get those packages
>
>> > that currently use * for matrix multiply to comply? (I don't consider
>
>> > this a serious counter-proposal. But you list a bunch of rejected
>
>> > alternatives; this could be in that list.
>
>>
> This is an interesting suggestion! I think it hasn't received full
>
>> consideration before because the tangle between numpy.ndarray and
>
>> numpy.matrix means that the most obvious implementation for an
>
>> ndarray.M attribute would be to return a full-fledged numpy.matrix
>
>> object... and no-one wants to encourage proliferation of numpy.matrix
>
>> objects. But returning a tiny special-purpose class that only
>
>> implements __mul__ would avoid that objection. At that point it's
>
>> basically a nicer version of the "user-defined infix" '*dot*' operator
>
>> idea. It has similar problems with needing an unaesthetically magical
>
>> implementation, producing a proliferation of special classes (one
>
>> extra one for each array type), requiring an allocation on every call,
>
>> etc., but this might well be the next-best thing to a real operator.
>
>>
> All in all, I think we'd rather have a real operator, so if you're
>
>> happy to go with @ then I won't put lots of effort into finding
>
>> horrible problems that force us to reject .M ;-), but I'll certainly
>
>> add it to the PEP in any case.
>
>>
> > - Is @@ really necessary? It seems you are adding it mostly because
>
>> > it's cute and because of the parallel with **, not because it is
>
>> > actually important enough to add new syntax. And then later you use
>
>> > it as an argument for @, which seems a bit circular. Also, if we
>
>> > were to make @ right-associative, the parallel with ** is already
>
>> > imperfect.
>
>>
> @@ hasn't received as much attention as the rest of the proposal, so
>
>> I'll check in with numpy-discussion etc. on this as well. But my
>
>> personal feeling is +0 on @@ -- all else being equal, it's nicer to
>
>> have it than not. Is all else equal? Given the existence of @, the
>
>> increase in language complexity is small (or arguably negative, since
>
>> people who know *, **, @ may be surprised to find @@ missing, and have
>
>> to memorize its non-existence as an extra rule); the opportunity cost
>
>> is low (given the existence of @ I can't imagine we'll want to use the
>
>> token @@ for something else later); and @@ will be used in real life,
>
>> if not as often as @ itself -- 'vec @@ 2' for squared Euclidean length
>
>> probably won't be too uncommon, 'matrix @@ n' gets used for things
>
>> like simulating random walks on graphs or other markov chains, and the
>
>> 'matrix @@ -1' notation will probably be a nice win for beginners and
>
>> other less-sophisticated programmers who just want to get some
>
>> computation done in a way that doesn't require them to keep a more
>
>> complicated mapping between math and code notation in their head or
>
>> caring about numerical details. I think of @@ being like, say, '%=' --
>
>> nothing one would ever add syntax for in isolation, but if designing
>
>> an overall system of operators then it makes more sense.
>
>>
> Probably in the end it just comes down to your aesthetic judgement
>
>> :-). Numeric folk will be fine either way.
>
>>
> (And I wouldn't consider @@ a *strong* argument for spelling '@' as
>
>> '@'; it's just mentioned in that section because there aren't really
>
>> *any* strong arguments for preferring one spelling versus another, we
>
>> have to make a decision, and so a weak argument is better than
>
>> nothing. Two useful operators for the complexity cost of one is a good
>
>> deal? :shrug: Obviously if @@ gets dropped I'll drop that bullet point
>
>> as well.)
>
>>
> > - For better counts of usages, perhaps Sourcegraph.com might help? It
>
>> > is a source code query engine that has a Python parser and (limited)
>
>> > type inference built in (also separately available as pysonar on
>
>> > github IIRC). To be clear, I don't need more numbers to be convinced.
>
>>
> Oo, that is shiny, thanks for the tip.
>
>>
> > Once we've decided on associativity and @@, I'm ready to accept.
>
>>
> Wonderful to hear! Thanks for giving this so much time and attention
>
>> (on no warning)!
>
>>
> -n
>
>>
> --
>
>> Nathaniel J. Smith
>
>> Postdoctoral researcher - Informatics - University of Edinburgh
>
>> http://vorpus.org
>
>> _______________________________________________
>
>> Python-ideas mailing list
>
>> Python... at python.org
>
>> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140314/161d878b/attachment-0001.html>
More information about the Python-ideas
mailing list