New submission from Serhiy Storchaka <storchaka+cpyt...@gmail.com>:

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

----------
components: Interpreter Core
messages: 312670
nosy: benjamin.peterson, brett.cannon, ncoghlan, serhiy.storchaka, yselivanov
priority: normal
severity: normal
status: open
title: AST optimizer: Change a list into tuple in iterations and containment 
tests
type: performance
versions: Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue32925>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to