You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
AST optimizer: Change a list into tuple in iterations and containment tests #77106
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2018-03-11.08:57:09.458>created_at=<Date2018-02-23.21:44:18.191>labels= ['interpreter-core', '3.8', 'performance']
title='AST optimizer: Change a list into tuple in iterations and containment tests'updated_at=<Date2018-03-11.08:57:09.457>user='https://github.com/serhiy-storchaka'
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
Activity
serhiy-storchaka commentedon Feb 23, 2018
Currently a list of constants is replaced with constant tuple in
x in [1, 2]andfor x in [1, 2]. The resulted AST is the same as forx in (1, 2)andfor x in (1, 2).The proposed simple PR extends this optimization to lists containing non-constants.
x in [a, b]will be changed intox in (a, b)andfor x in [a, b]will be changed intofor 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' -- '1 in [a, b]'
5000000 loops, best of 5: 58.9 nsec per loop
scoder commentedon Feb 24, 2018
An obvious optimisation, if you ask me. PR looks good to me superficially, but I don't know the AST code well.
serhiy-storchaka commentedon Feb 25, 2018
The direct inspiration of this optimization was your note that similar optimization was implemented in Python.
serhiy-storchaka commentedon Mar 11, 2018
New changeset 3f7e9aa by Serhiy Storchaka in branch 'master':
bpo-32925: Optimized iterating and containing test for literal lists (GH-5842)
3f7e9aa