python / python/cpython

Tier 2 optimizer: refactor to reuse constant symbols

Aperta
#120,325 0 commenti 0 reazioni 1 assegnatario Vedi su GitHub

@Fidget-Spinner ci sta già lavorando.

Dal 11/6/2024.

performance type-feature
Lingua principale
Python
Stelle
77.2k
Fork
35.9k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Feature or enhancement

Proposal:

Right now the optimizer loses information across constant values. Say for example

def test_propagate_constants_sources(self):
    def thing(unused):
        x = 0
        for _ in range(100):
            x = 1
            y = Foo.attr + Foo.attr
            # Type information of `Foo_attr` is not propagated to here.
            z = Foo.attr + Foo.attr
        return x
    
    class Foo:
        attr = 1

    res, ex = self._run_with_optimizer(thing, 1)
    opnames = list(iter_opnames(ex))
    self.assertIsNotNone(ex)
    guard_type_version_count = opnames.count("_GUARD_BOTH_INT")
    # Test fails, because we insert 2 type guards instead of 1 (ie type information is not propagated, and guards are repeated)
    self.assertEqual(guard_type_version_count, 1)

After we promote Foo.attr to constants, we don't keep source information, so we don't keep track that the first Foo.attr is the same as the subsequent ones. Then LOAD_CONST_INLINE loads a brand new constant symbol each time, with no information.

https://github.com/python/cpython/blob/main/Python/optimizer_bytecodes.c#L422

A possible solution would be to keep some sort of ID for all constant promotions around.

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

No response

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.