No, non è così .
La compilazione in byte code CPython viene passata solo attraverso un piccolo ottimizzatore di spioncino progettato per eseguire solo ottimizzazioni di base (vedere test_peepholer.py nella suite di test per ulteriori informazioni su queste ottimizzazioni).
Per dare un'occhiata a quello che sta per accadere, usa dis
* per vedere le istruzioni generate. Per la prima funzione, contenente l'assegnazione:
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
Mentre, per la seconda funzione:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
Nella prima vengono utilizzate altre due istruzioni (veloci): STORE_FAST
e LOAD_FAST
. Questi fanno una rapida memorizzazione e cattura del valore fastlocals
nell'array del frame di esecuzione corrente. Quindi, in entrambi i casi, RETURN_VALUE
viene eseguita una. Quindi, il secondo è leggermente più veloce a causa di meno comandi necessari per l'esecuzione.
In generale, tieni presente che il compilatore CPython è conservatore nelle ottimizzazioni che esegue. Non è e non cerca di essere intelligente come altri compilatori (che, in generale, hanno anche molte più informazioni con cui lavorare). L'obiettivo principale del design, oltre ad essere ovviamente corretto, è a) mantenerlo semplice eb) essere il più rapido possibile nel compilarli in modo da non notare nemmeno che esiste una fase di compilazione.
Alla fine, non dovresti preoccuparti di piccoli problemi come questo. Il vantaggio in termini di velocità è minimo, costante e, sminuito dall'overhead introdotto dal fatto che Python viene interpretato.
* dis
è un piccolo modulo Python che disassembla il codice, puoi usarlo per vedere il bytecode Python che la VM eseguirà.
Nota: come affermato anche in un commento di @Jorn Vernee, questo è specifico per l'implementazione CPython di Python. Altre implementazioni potrebbero fare ottimizzazioni più aggressive se lo desiderano, CPython no.
dis.dis(..)
su entrambi vedi che c'è una differenza , quindi sì. Ma nella maggior parte delle applicazioni del mondo reale , il sovraccarico di questo rispetto al ritardo dell'elaborazione nella funzione non è così tanto.