natural_comparison_key: faster sort keys for names without digits

Aberta Para iniciantes
#310 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@dexhunter já está trabalhando nisso.

Desde 7/11/2026.

  • #311 de @dexhunter — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
76/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
performance

Direção de pesquisa

Comece por natural_comparison_key em src/graphql/pyutils/natural_compare.py e leia tests/pyutils/test_natural_compare.py. Verifique se o caminho rápido proposto e a atribuição de fatia preservam as chaves existentes e, em seguida, execute o arquivo de teste indicado. A tarefa estará concluída quando os testes passarem e a otimização mantiver as chaves inalteradas.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

natural_comparison_key in src/graphql/pyutils/natural_compare.py runs for every name when lexicographic_sort_schema sorts a schema. It is also used by suggestion_list and sort_value_node.

Problem

The function always splits the name with a regex. Then it walks the parts with zip and itertools.cycle inside a generator. Most GraphQL names (userName, createdAt) have no digits. For these names, this work always gives the same one-item tuple (name,).

Numbers

I measured the current code and a small change with timeit (CPython 3.12, Linux). The table shows the time to compute the keys for each list of names.

Situation Current Proposed Change
GitHub schema names (3323 names) 2.11 ms 0.34 ms 84% faster
Letters only, userName (5000 names) 3.00 ms 0.38 ms 88% faster
Underscore names, USER_NAME (5000 names) 3.09 ms 1.83 ms 41% faster
Names with numbers, field12x3 (5000 names) 5.61 ms 3.72 ms 34% faster

Proposed fix

Return (key,) early when key.isalpha() is true, because such a name cannot contain a decimal digit. For other names, keep the regex split and replace the digit parts in one slice assignment instead of the zip/cycle generator. The keys stay exactly the same, and the existing tests in tests/pyutils/test_natural_compare.py pass.

Environment

  • graphql-core main at 1d505c1
  • CPython 3.12, Linux x86_64
Linguagem predominante
Python
Estrelas
534
Forks
159
Merge médio
1d 18h
PRs com merge (30d)
9

Preparar o ambiente

  • Sem Dockerfile nem arquivo Docker Compose
  • Tem um modelo de pull request
  • Sem guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de graphql-python/graphql-core

Todas as issues de graphql-python/graphql-core

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.