Speed up LexicalDistance.measure used for "Did you mean" suggestions
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 75/100
- Type d'issue
- Refactorisation
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- python
- Domaine
- backend-api-design, performance
Piste de recherche
Start by locating LexicalDistance.measure() and its callers in suggestion_list(); the issue names tests/benchmarks/test_validate_invalid_gql.py as a performance benchmark. Read the current distance calculation and run that benchmark to establish a baseline. Implement the proposed prefix/suffix trimming, threshold early return, and row-buffer changes, then compare benchmark results and check that suggestion behavior remains correct.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Problem
suggestion_list() calls LexicalDistance.measure() once for each option. When a query has a typo, validation uses this to build "Did you mean ...?" hints. On large schemas, this distance code takes most of the validation time.
The method does extra work for each option:
- It builds the full distance table even when a shared prefix or suffix needs no edits.
- It builds the table even when the option has more missing characters than the threshold allows.
- It calls
min()with three values in every cell, even when the two characters are equal. - It converts the option to a list of code points on every call.
Numbers
Python 3.12 on Linux. The Before column is the current main, and the After column is the proposed change.
| Situation | Before | After | Change |
|---|---|---|---|
tests/benchmarks/test_validate_invalid_gql.py (median) |
22.49 ms | 11.42 ms | 49% faster |
suggestion_list, 12-char typo, 2000 random names |
27.04 ms | 2.69 ms | 90% faster |
suggestion_list, 4-char typo, 2000 random names |
2.28 ms | 0.61 ms | 73% faster |
suggestion_list, 30-char input, 2000 random names |
0.70 ms | 0.30 ms | 58% faster |
| Exact or case-only matches, 2000 options | 0.170 ms | 0.179 ms | about the same (early return, code unchanged) |
Proposed fix
Skip the common prefix and suffix, and return early when too many characters are missing. In the table, copy the diagonal cell for equal characters, and rotate the row buffers.
Environment
graphql-core main (1d505c1), CPython 3.12, Linux x86_64.
- Langage dominant
- Python
- Étoiles
- 534
- Forks
- 159
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 9
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Aucun guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de graphql-python/graphql-core
-
collect_fields spends extra time on selections without directivesPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
graphql-python/graphql-core#315 ·
Les mainteneurs répondent en général sous 1 jour
-
is_printable_as_block_string checks each character in a Python loopPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
graphql-python/graphql-core#312 ·
Les mainteneurs répondent en général sous 1 jour
-
natural_comparison_key: faster sort keys for names without digitsPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
graphql-python/graphql-core#310 ·
Les mainteneurs répondent en général sous 1 jour
-
Make is_awaitable faster for values that are not awaitablePeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
graphql-python/graphql-core#308 ·
Les mainteneurs répondent en général sous 1 jour
-
assert_name checks each character in a Python generatorPeut-être pris @swayamdudhela l’a pris il y a 2 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
graphql-python/graphql-core#304 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de graphql-python/graphql-core
Issues similaires
-
Document style: tablesOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
-
Successor registrant to review: Navient Holdings, Inc. (CIK 2152623), 8-K12B 0001193125-26-436899Ouvertesuccessor-review
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
dgunning/edgartools#1889 ·
Les mainteneurs répondent en général sous 1 jour
-
`destroy` sans terminal répond « Aborted. » au lieu de réclamer `--yes` comme `clean` et `reset`Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
stephrobert/dsoxlab#354 ·
Les mainteneurs répondent en général sous 1 jour
-
hardware help wanted testing
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
mediajunkie/piper-morgan-product#2335 · 1 commentaire ·