On Sat, Jun 7, 2014 at 1:37 AM, Greg Ewing <greg.ew...@canterbury.ac.nz> wrote: > Julian Taylor wrote: >> >> tp_can_elide receives two objects and returns one of three values: >> * can work inplace, operation is associative >> * can work inplace but not associative >> * cannot work inplace > > > Does it really need to be that complicated? Isn't it > sufficient just to ask the object potentially being > overwritten whether it's okay to overwrite it? > I.e. a parameterless method returning a boolean.
For the numpy case, we really need to see all the operands, *and* know what the operation in question is. Consider tmp1 = np.ones((3, 1)) tmp2 = np.ones((1, 3)) tmp1 + tmp2 which returns an array with shape (3, 3). Both input arrays are temporaries, but neither of them can be stolen to use for the output array. Or suppose 'a' is an array of integers and 'b' is an array of floats, then 'a + b' and 'a += b' have very different results (the former upcasts 'a' to float, the latter has to either downcast 'b' to int or raise an error). But the casting rules depend on the particular input types and the particular operation -- operations like & and << want to cast to int, < and > return bools, etc. So one really needs to know all the details of the operation before one can determine whether temporary elision is possible. -n -- Nathaniel J. Smith Postdoctoral researcher - Informatics - University of Edinburgh http://vorpus.org _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com