coerce_input_literal spends extra time on type checks and non-null recursion

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

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Refactorización
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
performance

Línea de trabajo

Lee src/graphql/utilities/coerce_input_value.py y el benchmark de tests/benchmarks/test_execution_arguments.py. Comprueba cómo coerce_input_literal maneja los tipos NonNull y llama a los tres auxiliares de comprobación de tipos; después, realiza los cambios propuestos y ejecuta las pruebas y el benchmark pertinentes. El trabajo estará terminado cuando el comportamiento siga siendo el mismo y el benchmark muestre la mejora de rendimiento indicada.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

coerce_input_literal in src/graphql/utilities/coerce_input_value.py runs for every literal argument in a query. For example, it runs for multiplier: 2 once per item in tests/benchmarks/test_execution_arguments.py.

The function does two kinds of extra work:

  • For a NonNull type, it calls itself again with the inner type. The second call checks for a variable node and a non-null type again.
  • It uses the is_non_null_type, is_list_type and is_input_object_type helper functions. Each helper is one more function call around an isinstance check.

Measured on Python 3.12, median of 3 runs (time per call):

Situation Now With direct checks Change
Int! literal (multiplier: 2) 734 ns 479 ns 35% faster
[Int!] list of 10 ints 7557 ns 5089 ns 33% faster
input object {a: 1, b: "x"} 2355 ns 1717 ns 27% faster
variable $v 172 ns 156 ns no real change
execute_sync of the 1000-item benchmark query 5.32 ms 5.00 ms 6% faster

Proposed fix: unwrap the NonNull type in place instead of calling the function again. Use direct isinstance checks against GraphQLNonNull, GraphQLList and GraphQLInputObjectType in this one function. The results stay the same, and the full test suite passes with the change.

Environment: graphql-core main at 0aaea71, CPython 3.12.13, Linux x86_64.

Lenguaje dominante
Python
Estrellas
534
Forks
159
Merge medio
1 d 10 h
PR fusionados (30 d)
11

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.