Perché Python3 non ottimizza le assegnazioni delle variabili

2

Ho appena letto questa domanda SE sull'ottimizzazione dei parametri. Mi chiedevo se la compilazione bytecode di Python3 eseguisse la stessa ottimizzazione e questo è apparso not per essere il caso:

>>> def f(a): return 2*a
>>> def g(a): r=2*a; return r
>>> import dis
>>> dis.dis(f)
  1           0 LOAD_CONST               1 (2)
              2 LOAD_FAST                0 (a)
              4 BINARY_MULTIPLY
              6 RETURN_VALUE
>>> dis.dis(g)
  1           0 LOAD_CONST               1 (2)
              2 LOAD_FAST                0 (a)
              4 BINARY_MULTIPLY
              6 STORE_FAST               1 (r)
              8 LOAD_FAST                1 (r)
             10 RETURN_VALUE

Il controllo dei flag di compilazione ha mostrato che l'ottimizzazione è attiva:

>>> print(dis.code_info(f))
Name:              f
Filename:          <stdin>
Argument count:    1
Kw-only arguments: 0
Number of locals:  1
Stack size:        2
Flags:             OPTIMIZED, NEWLOCALS, NOFREE
Constants:
   0: None
   1: 2
Variable names:
   0: a

Quindi la mia domanda è: perché Python3 non ottimizza la variabile?

Ps: non sono sicuro che queste domande si adattino meglio a SE o a SO. Ho scelto SE perché la domanda che ha scatenato le mie domande era su SE. Se pensi che questa domanda si adatti meglio a SO, per favore fammelo sapere ...

    
posta agtoever 15.12.2018 - 15:09
fonte

1 risposta

4

CPython è l'implementazione di riferimento del linguaggio Python. Assegna priorità alla semplicità rispetto alle prestazioni e non esegue ottimizzazioni significative durante la compilazione bytecode.

Inoltre, un lavoro serio sulle prestazioni è costoso (come in, richiede molti anni-persona). Per i problemi a cui Python viene spesso applicato, il livello di prestazioni CPython corrente è spesso abbastanza buono, quindi c'è stata poca sponsorizzazione per lavorare su ottimizzazioni avanzate (come l'utilizzo di un compilatore JIT). Mentre c'era un progetto Unladen Swallow nel 2009-2011, il lavoro è svanito. Al contrario, tempo / denaro significativo è stato speso per le implementazioni di JavaScript perché lì il livello di prestazioni tipico di un interprete non era abbastanza buono.

Dove le prestazioni di Python sono critiche, generalmente hai le seguenti scelte:

  • usa le normali tecniche di ottimizzazione
  • usa un'implementazione Python diversa come PyPy (che può eseguire più ottimizzazioni di CPython)
  • riscrivi il codice come Cython e compilarlo.
  • riscrivi il codice in un'altra lingua (ad esempio C ++) e compila come un modulo CPython.

Ad esempio, molte parti critiche per le prestazioni nello stack SciPy sono effettivamente scritte in C, Fortran o Cython.

    
risposta data 15.12.2018 - 15:29
fonte

Leggi altre domande sui tag