python / python/mypy

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

オープン
#21,997 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

performance topic-enum
主要言語
Python
スター
20.6k
フォーク
3.3k
PR マージ指標
PR 指標を取得中

説明

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

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

リンクされた Playground の再現例から始め、早期の x == E.M0 チェックがある場合とない場合で型チェック時間を比較してください。mypy の enum の絞り込みと match チェックの経路を追跡し、そのうえで、大きな enum の例が二次的に遅くならなくなっていることを、報告されている絞り込み動作を維持しながら確認してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
compilers, devtools
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
55/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。