On Mon, Jun 18, 2018 at 6:20 PM Juancarlo Añez <apal...@gmail.com> wrote:
> For all practical purpose, it would be enough to define that the >>> expression: >>> >>> mylist += [item] >>> >>> gets optimized to mylist.append(item). >>> >> >> Unfortunately, that would create yet another special case of operators >> breaking the rules. Most operators invoke magic methods. This would prevent >> ``+=`` from invoking ``__iadd__`` for lists, since the right-hand side >> would need to be compiled differently. It's similar to why ``and`` and >> ``or`` keywords can't have magic methods. >> > > It seems that the optimization is already in place: > > > def main(): > print(timeit.timeit('using_append()', globals=globals(), number=REPS)) > print(timeit.timeit('using_concat()', globals=globals(), number=REPS)) > print(timeit.timeit('using_iadd()', globals=globals(), number=REPS)) > > I'm not intimately familiar with the opcodes, but I believe that any code involving the expression ``[x]`` will build a list. In [2]: dis.dis("a += [x]") 1 0 LOAD_NAME 0 (a) 2 LOAD_NAME 1 (x) 4 BUILD_LIST 1 6 INPLACE_ADD 8 STORE_NAME 0 (a) 10 LOAD_CONST 0 (None) 12 RETURN_VALUE I didn't run the timings, but I wouldn't be surprised if building a one-element list is faster than looking up an attribute. Or vice-versa. I thought you meant that you wanted to change the syntax such that ``a += [x]`` would, if the left-hand is a list, use different opcodes.
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/