Due concetti potrebbero aiutarci a comprendere meglio il motivo per cui Python compilato con codice macchina nativo "potrebbe" non essere eseguito velocemente come C compilato o altri linguaggi comunemente compilati. Sono chiamati associazione anticipata e associazione tardiva.
Dovrei iniziare dicendo che non sono un esperto di Python e sono venuto in questo sito per sbaglio. Ma mi piace questo sito.
Come accennato in un'altra risposta qui, il compilatore C ++ può sapere molto sul programma e prendere decisioni su quali operazioni utilizzare per specifiche strutture di dati. Ad esempio, se è necessario aggiungere due variabili intere, il compilatore sa che sono numeri interi nativi, ad esempio 32 bit di larghezza e può aggiungerli insieme con un'istruzione "ADD". Quindi compila le istruzioni ADD nel codice. È bloccato e non può essere modificato mentre il programma è in esecuzione. Questo è un legame precoce.
D'altra parte in un linguaggio come Python possiamo aspettarci che il programma lanci diversi tipi di dati insieme in modi complessi. Ora il compilatore non sa se le nostre 2 variabili sono numeri interi, float, stringhe o liste. Quindi deve compilare il codice che determina quell'informazione in fase di esecuzione e selezionare l'operazione corretta mentre il programma è in esecuzione. Questa è un'associazione tardiva e possiamo capire che ci sarà un colpo di prestazioni per fare quel lavoro extra mentre il programma è in esecuzione. È il prezzo che paghi per tenere aperte queste opzioni in una lingua come Python ma offre la massima flessibilità di run-time.