mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
bpo-32925: Optimized iterating and containing test for literal lists (GH-5842)
consisting of non-constants: `x in [a, b]` and `for x in [a, b]`. The case of all constant elements already was optimized.
This commit is contained in:
parent
4e2442505c
commit
3f7e9aa2ef
3 changed files with 44 additions and 2 deletions
|
@ -369,7 +369,8 @@ fold_subscr(expr_ty node, PyArena *arena, int optimize)
|
|||
}
|
||||
|
||||
/* Change literal list or set of constants into constant
|
||||
tuple or frozenset respectively.
|
||||
tuple or frozenset respectively. Change literal list of
|
||||
non-constants into tuple.
|
||||
Used for right operand of "in" and "not in" tests and for iterable
|
||||
in "for" loop and comprehensions.
|
||||
*/
|
||||
|
@ -378,7 +379,21 @@ fold_iter(expr_ty arg, PyArena *arena, int optimize)
|
|||
{
|
||||
PyObject *newval;
|
||||
if (arg->kind == List_kind) {
|
||||
newval = make_const_tuple(arg->v.List.elts);
|
||||
/* First change a list into tuple. */
|
||||
asdl_seq *elts = arg->v.List.elts;
|
||||
Py_ssize_t n = asdl_seq_LEN(elts);
|
||||
for (Py_ssize_t i = 0; i < n; i++) {
|
||||
expr_ty e = (expr_ty)asdl_seq_GET(elts, i);
|
||||
if (e->kind == Starred_kind) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
expr_context_ty ctx = arg->v.List.ctx;
|
||||
arg->kind = Tuple_kind;
|
||||
arg->v.Tuple.elts = elts;
|
||||
arg->v.Tuple.ctx = ctx;
|
||||
/* Try to create a constant tuple. */
|
||||
newval = make_const_tuple(elts);
|
||||
}
|
||||
else if (arg->kind == Set_kind) {
|
||||
newval = make_const_tuple(arg->v.Set.elts);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue