Da qui: What's the difference between eval, exec, and compile in Python?:
compile
è una versione di livello inferiore e exec
eval
. Non esegue o valuta le tue dichiarazioni o espressioni, ma restituisce un oggetto codice che può farlo. Le modalità sono le seguenti:
compile(string, '', 'eval')
restituisce il codice oggetto che sarebbe stato eseguito se aveste fatto eval(string)
. Si noti che è impossibile utilizzare le istruzioni in questa modalità; solo una (singola) espressione è valida.
compile(string, '', 'exec')
restituisce l'oggetto codice che sarebbe stato eseguito se l'utente avesse eseguito exec(string)
. Puoi usare qualsiasi numero di dichiarazioni qui.
compile(string, '', 'single')
è come la modalità exec
, ma ignorerà tutto tranne la prima istruzione. Si noti che una dichiarazione if
/else
con i relativi risultati è considerata una singola istruzione.
UPDATE:
Quando per compilare Python?
Generalmente si compila Python per sfruttare le prestazioni. Il codice compilato ha un tempo di avvio molto più veloce poiché non deve essere compilato, ma non viene eseguito più rapidamente.
In particolare, è possibile utilizzare compile
se si desidera convertire il codice in bytecode a mano. Questo fa emergere un'altra importante, ma pertinente domanda perché fare questo?
Come riferimento in questo magnificent article:
se si desidera utilizzare exec e si prevede di eseguire il codice più di una volta, assicurarsi che si compila in bytecode prima e quindi eseguire che bytecode solo ed solo in un nuovo dizionario come spazio dei nomi.
Di particolare nota è questo:
Ora quanto più veloce è l'esecuzione di bytecode sulla creazione di bytecode e l'esecuzione di questo?:
$ python -mtimeit -s 'code = "a = 2; b = 3; c = a * b"' 'codice exec' 10000 cicli, migliore di 3: 22,7 usec per loop
$ python -mtimeit -s 'code = compile ("a = 2; b = 3; c = a * b",
"", "exec")' 'codice exec' 1000000 loop, meglio di 3: 0.765 usec per loop
32 volte più veloce per un esempio di codice molto breve. Diventa molto peggio più codice hai. Perché è così? Poiché l'analisi del codice Python e la conversione in Bytecode è un'operazione costosa rispetto alla valutazione del bytecode. Ovviamente questo riguarda anche lo execfile
che non utilizza totalmente cache bytecode, come dovrebbe. Non verificherà magicamente se esiste un file .pyc
se si è passando il percorso a un file foo.py
.
Questo è quello che ho raccolto da ciò che fa, ma non è ancora chiaro quando/perché per usarlo. L'unica cosa che viene in mente sarebbe un rapido controllo per vedere se ci sono errori di sintassi prima di chiamare un 'eval'/'exec'. –
@AdamLewis, mi scuso. Aggiornato. – jrd1
Grande aggiornamento. Avevo l'impressione che fosse orientato solo a essere davvero utile quando si usava il built-in di 'exec'. Grazie per aver dedicato del tempo a far luce sull'argomento. –