Hi Stefan, On 5 July 2014 11:34, Stefan Behnel <stefan...@behnel.de> wrote: > Hi, > > I started optimising cascaded assignments a little to reduce the > unnecessary duplication of coercions. While doing that, I found this test > in memslice.pyx: > > ''' > def cascaded_buffer_assignment(obj): > """ > >>> A = IntMockBuffer("A", range(6)) > >>> cascaded_buffer_assignment(A) > acquired A > acquired A > released A > released A > """ > cdef int[:] a, b > a = b = obj > ''' > > It's explicitly tested for that we create two independent memory views in > this case. Is there an actual reason for this? As long as the types of a > and b are identical, I don't see why we would want to request the buffer > twice.
I think it's mostly for simplicity, since any reaching definition is cleared at the end of the function. Are you thinking to generally implement this? I suppose you could assign the coercion to a new variable and replace all use sites (e.g. all the coercions in the cascaded assignment) with that variable. obj = ... a = coerce obj int[:] b = coerce obj int[:] -> obj = ... tmp = coerce obj int[:] a = tmp b = tmp These transformations may be easier on a three-address code-like representation, where this sort of replacement can be more effective in SSA form or by first applying copy propagation. Perhaps if the coercion was explicit a CSE pass could even eliminate any duplicates. Cheers, Mark > Stefan > _______________________________________________ > cython-devel mailing list > cython-devel@python.org > https://mail.python.org/mailman/listinfo/cython-devel _______________________________________________ cython-devel mailing list cython-devel@python.org https://mail.python.org/mailman/listinfo/cython-devel