natural_comparison_key: faster sort keys for names without digits
Maintainer antworten meist innerhalb von 1 Tag
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 76/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- python
- Bereich
- performance
Rechercherichtung
Beginne mit natural_comparison_key in src/graphql/pyutils/natural_compare.py und lies tests/pyutils/test_natural_compare.py. Prüfe, ob der vorgeschlagene schnelle Pfad und die Slice-Zuweisung die bestehenden Schlüssel bewahren, und führe dann die angegebene Testdatei aus. Fertig ist die Aufgabe, wenn die Tests bestehen und die Optimierung die Schlüssel unverändert lässt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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
mainat 1d505c1 - CPython 3.12, Linux x86_64
- Vorherrschende Sprache
- Python
- Sterne
- 534
- Forks
- 159
- Ø Merge
- 1 T. 18 Std.
- Gemergte PRs (30 T.)
- 9
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Kein Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus graphql-python/graphql-core
-
collect_fields spends extra time on selections without directivesEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
graphql-python/graphql-core#315 ·
Maintainer antworten meist innerhalb von 1 Tag
-
is_printable_as_block_string checks each character in a Python loopEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
graphql-python/graphql-core#312 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Make is_awaitable faster for values that are not awaitableEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
graphql-python/graphql-core#308 ·
Maintainer antworten meist innerhalb von 1 Tag
-
assert_name checks each character in a Python generatorEvtl. vergeben @swayamdudhela hat das vor 2 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
graphql-python/graphql-core#304 · 4 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
coerce_input_literal spends extra time on type checks and non-null recursionEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
graphql-python/graphql-core#302 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in graphql-python/graphql-core
Ähnliche Issues
-
Document style: tablesOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
-
Successor registrant to review: Navient Holdings, Inc. (CIK 2152623), 8-K12B 0001193125-26-436899Offensuccessor-review
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
dgunning/edgartools#1889 ·
Maintainer antworten meist innerhalb von 1 Tag
-
`destroy` sans terminal répond « Aborted. » au lieu de réclamer `--yes` comme `clean` et `reset`Offenbug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
stephrobert/dsoxlab#354 ·
Maintainer antworten meist innerhalb von 1 Tag
-
hardware help wanted testing
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
mediajunkie/piper-morgan-product#2335 · 1 Kommentar ·