Issue 32925: AST optimizer: Change a list into tuple in iterations and containment tests (original) (raw)
Currently a list of constants is replaced with constant tuple in x in [1, 2]
and for x in [1, 2]
. The resulted AST is the same as for x in (1, 2)
and for x in (1, 2)
.
The proposed simple PR extends this optimization to lists containing non-constants. x in [a, b]
will be changed into x in (a, b)
and for x in [a, b]
will be changed into for x in (a, b)
. Since creating a tuple is faster than creating a list the latter form is a tiny bit faster.
$ ./python -m timeit -s 'a, b = 1, 2' -- 'for x in [a, b]: pass' 5000000 loops, best of 5: 93.6 nsec per loop
$ ./python -m timeit -s 'a, b = 1, 2' -- 'for x in (a, b): pass' 5000000 loops, best of 5: 74.3 nsec per loop
./python -m timeit -s 'a, b = 1, 2' -- '1 in [a, b]' 5000000 loops, best of 5: 58.9 nsec per loop
$ ./python -m timeit -s 'a, b = 1, 2' -- '1 in (a, b)' 10000000 loops, best of 5: 39.3 nsec per loop