On Wed, Mar 12, 2014 at 12:28 AM, Steven D'Aprano <st...@pearwood.info> wrote: > On Tue, 11 Mar 2014 23:25:19 -0400, Terry Reedy wrote: >> Nope, 'similar' is not 'equivalent'. Evaluating x twice instead of once >> and possibly allocating a new object versus not take extra time. In a >> statement like "x.y.z[3*n+m] += 1", calculating the target dominates the >> time to increment, so this form should be nearly twice as fast. > > Excellent point Terry! > > I always forget that the target of an augmented assignment may not be a > simple name like "x" but can be an arbitrary complex reference, anything > that is a legal assignment target. Because += is documented as only > evaluating the expression once it can behave quite differently to the > `spam = spam + 1` case. Evaluating the right hand side may have side- > effects that change what the left hand side evaluates to. This is not the > case with the augmented assignment.
Of course one could also do: z = x.y.z i = 3*n+m z[i] = z[i] + 1 which reduces the duplicated work down to storing and loading a couple of locals, and also prevents side-effects from affecting the LHS evaluation. -- https://mail.python.org/mailman/listinfo/python-list