collect_fields spends extra time on selections without directives

Abierto Apto para principiantes
#315 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@dexhunter ya está trabajando en esto.

Desde el 8/11/2026.

  • #316 de @dexhunter — abierto

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

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de graphql-python/graphql-core

Todos los issues de graphql-python/graphql-core

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.