collect_fields spends extra time on selections without directives
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- python
- Área
- performance
Línea de trabajo
Empieza con visit_selection_sets() en src/graphql/execution/collect_fields.py y sigue su llamada a should_include_node() para las selecciones con y sin directivas. Revisa las pruebas existentes de recopilación de campos y del comportamiento de las directivas antes de cambiar el bucle. La optimización estará lista cuando preserve los resultados, los errores y las listas de directivas prohibidas, a la vez que evita comprobaciones innecesarias de directivas; compara los tiempos con los casos de benchmark del issue.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
visit_selection_sets() in src/graphql/execution/collect_fields.py runs for every selection set before resolvers run.
For each selection, it calls should_include_node(), even when the selection has no directives.
should_include_node() then builds two generator expressions to look for @skip and @include.
Most fields in real queries have no directives, so this work is repeated for almost every field.
| Situation | Now | With the proposed fix | Change |
|---|---|---|---|
collect_fields on 4,000 plain fields |
4458.7 µs | 4113.4 µs | 7.7% less time |
collect_fields on 4,000 fields with @include(if: $t) |
10988.9 µs | 8593.5 µs | 21.8% less time |
collect_fields on 40 inline fragments with 100 fields each |
4561.1 µs | 4165.7 µs | 8.7% less time |
collect_fields on 400 named fragment spreads with 1 field each |
960.0 µs | 889.9 µs | 7.3% less time |
These are medians of 31 timing rounds, and the median of 3 alternating processes per version.
Proposed fix: check selection.directives once in the loop and skip the should_include_node() call when it is empty.
Find @skip and @include in one plain loop instead of two generator expressions.
Results, errors and forbidden-directive lists stay the same.
Environment: CPython 3.12.13, Linux x86-64, AMD EPYC 9R14, graphql-core main at 1d505c1.
- Lenguaje dominante
- Python
- Estrellas
- 534
- Forks
- 159
- Merge medio
- 1 d 18 h
- PR fusionados (30 d)
- 9
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Sin guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de graphql-python/graphql-core
-
is_printable_as_block_string checks each character in a Python loopPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
graphql-python/graphql-core#312 ·
Los mantenedores suelen responder en 1 día
-
natural_comparison_key: faster sort keys for names without digitsPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
graphql-python/graphql-core#310 ·
Los mantenedores suelen responder en 1 día
-
Make is_awaitable faster for values that are not awaitablePosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
graphql-python/graphql-core#308 ·
Los mantenedores suelen responder en 1 día
-
assert_name checks each character in a Python generatorPosiblemente ocupada @swayamdudhela la tomó hace 2 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
graphql-python/graphql-core#304 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
-
coerce_input_literal spends extra time on type checks and non-null recursionPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
graphql-python/graphql-core#302 ·
Los mantenedores suelen responder en 1 día
Todos los issues de graphql-python/graphql-core
Issues similares
-
`destroy` sans terminal répond « Aborted. » au lieu de réclamer `--yes` comme `clean` et `reset`Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
stephrobert/dsoxlab#354 ·
Los mantenedores suelen responder en 1 día
-
hardware help wanted testing
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
jasonacox/pypowerwall#472 ·
Los mantenedores suelen responder en 1 día
-
[Bug]: DoubleMLRDDData accepts a score_col that is no data column (as in its docstring example); the running variable then becomes a covariate and RDFlex failsPosiblemente ocupada @vrjdev la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
DoubleML/doubleml-for-py#455 ·
Los mantenedores suelen responder en 1 día
-
[Bug]: Python mod.Box[T] annotation gets a false generic_arg edge that replaces the parameter_type one ('is' on tree-sitter nodes)Posiblemente ocupada @rohit-jsfreaky la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Graphify-Labs/graphify#5110 · 1 comentario ·
Los mantenedores suelen responder en 2 días