python / python/mypy

Checking a match on an enum becomes quadratically slow after the variable was narrowed by an == check

Offen
#21,997 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

performance topic-enum
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

Type-checking a match on a large enum becomes very slow when the variable was first narrowed by an == check with an early exit:

from enum import StrEnum

class E(StrEnum):
    M0 = "m0"
    M1 = "m1"
    # ... 1,200 members

def f(x: E) -> None:
    if x == E.M0:
        return
    match x:
        case E.M1:
            pass
        # ... through case E.M7

Removing the x == E.M0 block makes this much faster (~1.5s vs 22s locally).

To Reproduce

Your Environment

  • Mypy version used: 2.3.1, 2.4.0+dev.4d195a2
  • Python version used: 3.12

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit der verknüpften Playground-Reproduktion und vergleiche die Zeit für die Typprüfung mit und ohne die frühe x == E.M0-Prüfung. Verfolge anschließend in mypy die Pfade zur Enum-Eingrenzung und zur Match-Prüfung und verifiziere dann, dass das Beispiel mit einem großen Enum nicht mehr quadratisch langsam wird, während das berichtete Eingrenzungsverhalten erhalten bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers, devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Aktiv
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.